Java中的锁以及CountDownLatchCyclicBarrierSemaphore的线程排序

Java中的锁以及CountDownLatchCyclicBarrierSemaphore的线程排序,第1张

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()

参考:尚硅谷面试视频

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5696467.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存