栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java中的锁以及CountDownLatch/CyclicBarrier/Semaphore的线程排序

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java中的锁以及CountDownLatch/CyclicBarrier/Semaphore的线程排序

跟MySQL的锁有区别也有关系

公平锁和非公平锁

 ReentrantLock默认是非公平的,但是如果加了true就是公平锁。非公共锁吞吐量比公平锁大。

synchronized也是非公平锁。

可重入锁(递归锁ReentrantLock/synchronized):同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,即线程可以进入任何一个它已经拥有的锁所同步着的代码块。是同一把锁,可重入锁的最大作用就是避免死锁

自旋锁(CAS思想+Unsafe类如原子引用)

指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。

手写一个自旋锁:

 独占锁(写锁)/共享锁(读锁)/互斥锁

独占锁:该锁一次只能被一个线程所持有,对ReentrantLock和Synchronized都是独占锁。

共享锁:该锁能被多个线程所共享持有。对ReentrantReadWriteLock,用什么锁调用各自方法,其读锁是共享锁,其写锁是独占锁。

读锁:写锁类似

 互斥锁:就是独享锁的一种实现。若同一线程对非递归的互斥量多次加锁,可能会造成死锁。递归互斥量(可重入锁)则无此风险。

CountDownLatch/CyclicBarrier/Semaphore  线程排序
1.CountDownLatch 计数器

让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒。(秦灭六国,才能统一)

  两个方法:一个是countdown,减一,调用countdown方法的线程不会阻塞;一个是await,直到计数器为0才执行,调用await方法的线程会被阻塞直到计数器为0唤醒执行。

main方法必须最后执行

上面六国是随机执行的,但是其中六国被灭的顺序要制定的解决方案:枚举,类似于数据库

 2.CyclicBarrier

 可循环使用的屏障,让一组线程到达一个屏障时被阻塞,直到最后一个线程到达才会开门。集齐7个龙珠才能召唤神龙

当调用await()方法之后,线程就处于barrier了。直到7个线程全部阻塞才会开启。 

CountDownLatch是做减法,CyclicBarrier是做加法,Semaphore可以伸缩

3.Semaphore 

信号灯(争车位) ,是多个线程抢多个资源,syn是多个线程抢一个资源。主要用于两个目的:一个是用于多个共享资源的互斥使用,另一个是用于并发线程数的控制。构造器可以设置公平还是非公平锁。可以资源复用,释放资源。

两个方法:acquire()和release()

参考:尚硅谷面试视频

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/696327.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号