1. synchronized锁:
• 定义:Java内置的关键字锁,用于实现线程间的同步。它可以修饰方法或代码块。
• 特性:隐式获取和释放锁,自动处理锁的粒度(方法级或代码块级),支持重入性。
• 限制:灵活性较低,无法响应中断,无法尝试获取锁(只能阻塞等待)。
2. ReentrantLock(可重入锁):
• 定义:java.util.concurrent.locks包中的接口,实现了Lock接口,提供了更高级的锁功能。
• 特性:显式获取和释放锁,支持可重入性,提供公平锁和非公平锁两种实现,支持响应中断,可以尝试获取锁(tryLock方法)。
• 方法:lock()、unlock()、tryLock()、lockInterruptibly()、isLocked()、isHeldByCurrentThread()等。
3. ReadWriteLock(读写锁):
• 定义:java.util.concurrent.locks包中的接口,将锁分为读锁和写锁,允许多个读线程并发访问,但写线程独占访问。
• 特性:提高读操作的并发性,写操作仍然保证独占性,读锁和写锁之间互斥。
• 实现:通常通过ReentrantReadWriteLock来实现,它提供了公平和非公平两种策略。
• 方法:readLock()、writeLock()等,分别用于获取读锁和写锁。
4. StampedLock(戳记锁):
• 定义:Java 8引入的一种锁,提供了三种模式:写锁、乐观读锁和悲观读锁,通过戳记来标识锁的状态和所有权。
• 特性:乐观读锁允许在没有竞争的情况下无阻塞地读取数据,但在检测到写锁时可能需要重新读取;悲观读锁和写锁则类似于ReadWriteLock中的读锁和写锁。
• 方法:writeLock()、readLock()、tryOptimisticRead()、validate(stamp)等,分别用于获取锁和验证戳记的有效性。
5. 公平锁与非公平锁:
• 定义:根据线程获取锁的顺序来区分,公平锁按照先来后到的顺序分配锁,非公平锁则允许线程“插队”。
• 特性:公平锁减少了线程饥饿的可能性,但可能导致性能下降;非公平锁提高了性能,但可能增加线程饥饿的风险。
6. 可重入性与不可重入性:
• 定义:可重入锁允许持有锁的线程再次获取该锁而不会导致死锁;不可重入锁则不允许这种操作。
• 特性:可重入锁通常通过内部维护一个计数器来实现,每次获取锁时计数器加1,释放锁时计数器减1;不可重入锁则没有这样的机制。