是否锁住资源分为悲观锁(互斥同步锁)和乐观锁
悲观锁 典型的就是synchronize锁和Lock锁
互斥同步锁, 阻塞和唤醒带来的性能劣势,死锁导致的永久阻塞
乐观锁 不会锁住被操作的对象,他在修改期间会检测是否别人修改过数据,如果别人修改过,自己就不能继续修改了,可以选择放弃,报错,重试等
乐观锁一般使用cas算法来实现
使用场景
悲观锁 适合于并发写入较多的情况下,适用于临界区持锁时间比较长的情况,悲观锁可以减少大量无用自旋消耗
1、临界区有io操作
2、临界区代码复杂或者循环量比较大
3、临界区竞争非常激烈
乐观锁 适合并发写比较少,大部分是读的场景,不加锁能够让读的操作大幅提高
多个线程是否可以共享一把锁分为共享锁和独占锁
多个线程竞争锁是否需要排队分为公平锁和非公平锁
同一个线程是否可以重复获取同一把锁分为可重入锁和非重入锁
可重入性可以避免死锁
可重入锁也叫递归锁,它俩等同于一回事,指的是同一线程外层函数获得锁之后,内层递归函数仍然能获得该锁的代码,同一线程在外层方法获取锁的时候,再进入内层方法会自动获取锁。也就是说,线程可以进入任何一个它已经拥有的锁所同步着的代码块。ReentrantLock 和 synchronized 就是典型的可重入锁!
网友评论