JAVA-Lock解析-一-Lock
2019-10-10 本文已影响0人
AlanSun2
首先提出个问题,为什么有了 synchronized 还需要 Lock?
因为 synchronized 有时候效率实在太低了。比如对文件的读写,你希望文件写完之后再被读,这时候按 synchronized 的方法,你会对读和写方法都加上锁,这样导致的结果就是,多个读线程读时,也需要获取和释放锁,但我们知道读于读之间时不会冲突的,这也就浪费了资源,效率很低。而且不灵活,synchronized 只能在同意范围内释放,而 Lock 可以在任意范围内释放锁。
什么是锁?
JAVA 官方回答:锁是一种用于控制多个线程对共享资源的访问的工具。
Lock
Lock 代替了synchronized ,它比 synchronized 更灵活,提供了更多获取锁的方法,例如 tryLock(尝试获取锁),tryLock(time),lockInterruptibly,但需要注意的是和 synchronized 不同你需要手动的释放你获取的锁。所有的 Lock 都是悲观锁。
方法 | 说明 |
---|---|
lock | 等待知道获取锁 |
lockInterruptibly | 等待直到获取锁或者线程被中断,如果线程已中断则抛出 InterruptedException |
tryLock | 如果锁可用返回 true,不可用返回 false |
tryLock(time, unit) | 等待 time 的时间,如果锁可用返回 true,不可用返回 false |
unlock | 释放锁 |
newCondition | 返回一个 Condition 如果实现类支持该操作 |
相关类
ReentrantLock,ReentrantReadWriteLock,ReentrantReadWriteLock,StampedLock,CountDownLatch