1. synchronized 锁
synchronized
是Java中最基本的内置锁机制,用于锁定方法或代码块。它确保同一时刻只有一个线程可以执行被锁定的代码。sychronized
锁是可重入的,也就是说,如果一个线程已经获得了某个锁,它可以再次获得该锁而不会被阻塞。
2. ReentrantLock
ReentrantLock
是Java java.util.concurrent.locks
包中的显式锁,提供了比synchronized
更灵活的锁机制。ReentrantLock
允许手动加锁和解锁,提供了更多的控制选项,如尝试锁定、超时锁定和公平锁选择。与synchronized
类似,ReentrantLock
也是可重入的。
3. ReadWriteLock
ReadWriteLock
包含两个锁,一个读锁和一个写锁。读锁允许多个线程同时读,但写锁只允许一个线程写,并且写操作会阻塞读操作。这种机制适用于读多写少的场景,可以显著提高并发性能。
4. StampedLock
StampedLock
是Java 8引入的一种锁,它提供了读写锁的功能,同时还支持乐观读锁。相比于ReadWriteLock
,StampedLock
的性能更好,但使用起来更复杂。乐观读锁允许在没有实际加锁的情况下进行读操作,从而提高并发性能,但需要在操作后验证数据的完整性。
5. Condition
Condition
是与Lock
结合使用的,用于线程间的协调。它类似于Object
类的wait
和notify
方法,但功能更强大。Condition
允许线程等待某个特定的条件,并在条件满足时被唤醒,适用于复杂的线程间通信和协调。
总结
不同的锁机制适用于不同的场景:
- synchronized:简单易用,适用于大多数基本同步需求。
- ReentrantLock:提供更灵活的锁机制,适用于需要高级功能(如尝试锁定、超时锁定)的场景。
- ReadWriteLock:适用于读多写少的场景,提高并发性能。
- StampedLock:提供更高性能的读写锁和乐观读锁,适用于高并发场景。
- Condition:与
Lock
结合使用,用于复杂的线程间协调。