标签:idt 轻量 轻量级 同步 自旋 巩固 操作 写锁 无法
之前一直对锁的知识半知半解,写篇博客巩固下。
1、悲观锁、乐观锁
悲观锁每次操作都会加锁,会造成线程堵塞。而乐观锁则是假设不会冲突,每次操作都不会加锁。所以相较而言,乐观锁比较适合于竞争较少的场景,悲观锁比较适合竞争严重的情况。
2、公平锁、非公平锁
如果多个线程按照申请锁的顺序来获取锁,则是公平锁。举个例子:如果线程A获取锁,这时候B线程来请求该锁的持有权,会被挂起等待。等待的过程中,C线程也来竞争该锁,如果是非公平锁的情况,就会存在B、C线程同时竞争获取锁。可想而知,公平锁会带来更多的性能开销,所以没有特殊场景一般就用非公平锁就可以。
3、可重入锁
同一线程外层函数获取锁之后,内层函数依赖可以获取该锁。ReentranceLock、Sychronized都是可重入锁。
4、共享锁、排他锁
排他锁模式下,每次只能有一个线程持有锁。共享锁则允许多个线程同时获取锁。ReentrantReadWriteLock提供了读写锁实现,适用于读多写少的场景。
5、自旋锁
一个线程在获取锁的时候,如果锁已被其他线程获取,那么该线程将不断尝试获取,直到其他线程释放锁就可以立即获得锁,避免了用户线程和内核切换。但是线程如果一直无法获取锁,且处于活跃状态,没有执行有效的任务就会导致cpu空转。
6、偏向锁→轻量级锁→重量级锁
偏向锁:不存在线程竞争的情况下,只有一个线程访问同步资源
轻量级锁:偏向锁遇到其他线程抢占锁时,会升级为轻量级锁,没有获取到锁的线程会以自旋的方式等待锁释放
重量级锁:当轻量级锁被自旋到一定次数还没被获取到,就会升级为重量级锁,此时其他线程就会堵塞。
标签:idt 轻量 轻量级 同步 自旋 巩固 操作 写锁 无法
原文地址:https://www.cnblogs.com/fengyingdong/p/11437483.html