锁,多线程开发的基础,线程安全结构的基础,今天研究一下锁
说到多线程,我们还会想到synchronized关键字,锁和同步块相比,区别是什么?
先说结论,锁比同步关键字更实用,建议用锁
- Lock 是 interface, Synchronized 是关键字.
- Synchronized 自动释放锁, Lock 需要手动释放.
- Lock 在等待时可以被打断, 但是Synchronized 不可以,需要一直等待.
- Lock 明确知道是否有锁, 但是Synchronized 做不到.
- Synchronized 是CPU悲观锁机制,多线程时需要频繁切换CPU上下文,Lock是乐观锁机制,多线程是性能更高.
- Synchronized 可以用于class, methods, 和代码块, Lock可以用于代码逻辑
- Synchronized 不能实现公平锁, Lock 可以实现
Lock Interface
java.util.concurrent.locks.lock
常见实现
ReentrantLock
直接代码,来自网络
1 | public class SharedObject { |
ReentrantReadWriteLock
读写锁,读等待写,写等待读
1 | public class SynchronizedHashMapWithReadWriteLock { |
StampedLock
Java 8 新引入的一个锁实现,可以返回stamp,用其解锁或检查锁是否还有效
1 | public class StampedLockDemo { |
Condition 接口
条件接口可以定义自己的条件约束,制定等待逻辑
1 | public class ReentrantLockWithCondition { |
总结
还有一些细节没有深入研究。ConcurrentHashMap中同时看到了synchronized和ReentrantLock身影
下次应该总结一下Thread了吧