Java 中的锁
Java juc 锁 About 1,347 words关键词和类
- synchronized
- ReentrantLock
- ReentrantReadWriteLock
- StampedLock
- LockSupport
名词术语
- 偏向锁
- 轻量级锁
- 重量级锁
- 公平锁
- 非公平锁
- 可重入锁
- 递归锁
- 自旋锁
- 独占锁
- 共享锁
- 互斥锁
- 读锁
- 写锁
- 分段锁
公平锁/非公平锁
公平锁就是队列,多个线程按照锁的申请顺序来获取锁,类似排队打饭,先来后到。
非公平锁,就是加塞,能加塞上就加,加不上再变公平锁,获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。在高并发的情况,有可能会造成优先级反转或饥饿现象。
非公平锁优点在于吞吐量比公平锁大。
synchronized
和ReentrantLock
默认都是非公平锁。
可重入锁/递归锁
可重入锁又叫递归锁。
线程可以进入任何一个它已经拥有的锁的同步着的代码块。
自旋锁
获取锁的线程不会立即阻塞,采用循环的方式去尝试获取锁。
好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU
。
独占锁
锁一次只能被一个线程持有。对synchronized
和ReentrantLock
而言都是独占锁。
共享锁
该锁可以被多个线程所持有。
ReentrantReadWriteLock
:读锁是共享锁,写锁是独占锁,但读写是互斥的,写的时候不能读,读的时候不能写。
synchronized
底层原理
monitor enter
和monitor exit
指令。
为什么有两个 monitor exit
第一个monitorexit
是正常程序退出,第二个monitorexit
是确保异常情况下锁也能解除。
public static void main(java.lang.String[]);
Code:
0: ldc #2 // class lock/SyncDemo
2: dup
3: astore_1
4: monitorenter
5: aload_1
6: monitorexit
7: goto 15
10: astore_2
11: aload_1
12: monitorexit
13: aload_2
14: athrow
15: return
Exception table:
from to target type
5 7 10 any
10 13 10 any
Lock
底层原理
AQS
+CAS
。
synchronized 与 Lock 区别
synchronized
- 非公平锁
synchronized
属于jvm
层面,Java
关键字- 不需要用户手动释放,同步代码块执行完毕后会自动释放
- 不可中断。要么完成要么抛出异常
Lock
- 非公平锁和公平锁都可以
Lock
是Java API
层面,Java5
后- 需要用户手动释放,若没有释放,就有可能导致出现死锁现象
- 可中断,设置超时时间
tryLock(long timeout, TimeUnit unit)
Views: 2,354 · Posted: 2021-04-03
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...