一、锁的整体分类
在java中锁被分成了4类,即:
1、可重入锁、不可重入锁
2、乐观锁、悲观锁
3、公平锁、非公平锁
4、共享锁、互斥锁
二、可重入锁、不可重入锁
1、可重入锁:当线程A已经拿到了锁S,当线程A再次场次获取锁S,线程A是可以获取
到锁S的;可重入锁拿到了几次,线程开释锁时就要开释同样次数的锁。
java中的synchronized、ReentrantLock、ReentrantReadWriteLock都是
可重入锁。
2、不可重入锁:当线程A已经拿到了锁S,当线程A再次场次获取锁S,线程A是不可以获取
到锁S的,由于锁S已经被占用;如 线程池 ThreadPoolExecutor 中的内部
类 Worker 就是一个不可重入锁,其获取锁的代码如下图所示:
三、乐观锁、悲观锁
1、乐观锁
获取不到锁资源时,可以让CPU调理再次实行获取锁资源(可以当作“自旋”,)
java中提供的CAS操作就是一种乐观锁的实现方式,他不涉及线程的挂起操作,
2、悲观锁
当获取不到锁资源时,会将当火线程挂起(即将当火线程设置为 BLOCKED
或 WAITING 状态);线程的挂起或涉及用户态和内核态之间的切换,而这种切换
黑白常消耗CPU资源的,所以应该尽量制止用户态与内核态之间的切换。
java中的synchronized、ReentrantLock、ReentrantReadWriteLock都是悲观锁
四、公平锁、非公平锁
1、公平锁
当线程A、B同时去竞争锁资源T,若A乐成拿到了锁T,线程B没有拿到锁T,线程B去
列队等待A开释锁资源;此时线程C进来了,锁T被A持有,同时线程B在列队,此时线程
C也必要去列队且C排到B后边。
2、非公平锁
当线程A、B同时去竞争锁资源T,若A乐成拿到了锁T,线程B没有拿到锁T,线程B去
列队等待A开释锁资源;此时线程C进来了,线程C先去实行竞争一下锁资源,若C竞争
到了锁T,则C持有锁资源,否则线程C必要去列队且C排到B后边。
java中的synchronized 一定黑白公平锁
java中的ReentrantLock、ReentrantReadWriteLock 可以是公平锁,也可以黑白公平锁。
五、共享锁、互斥锁
1、共享锁
同一时间点,可以有多个线程同时持有的锁称为共享锁
2、互斥锁
同一时间点,只有一个线程能持有的锁 称为互斥锁;
java中的synchronized、ReentrantLock 是互斥锁
java中的 ReentrantReadWriteLock有互斥锁也有共享锁,其中写锁是互斥锁,读锁是共享锁
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |