跟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个线程全部阻塞才会开启。
3.SemaphoreCountDownLatch是做减法,CyclicBarrier是做加法,Semaphore可以伸缩
信号灯(争车位) ,是多个线程抢多个资源,syn是多个线程抢一个资源。主要用于两个目的:一个是用于多个共享资源的互斥使用,另一个是用于并发线程数的控制。构造器可以设置公平还是非公平锁。可以资源复用,释放资源。
两个方法:acquire()和release()
参考:尚硅谷面试视频
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)