一、简介
简介
Java中划分锁的方式不同,就产生了各种对锁的定义。
并发控制
当程序中可能出现并发的情况时,就需要保证在并发情况下数据的准确性,以此确保当前用户和其他用户一起操作时,所得到的结果和他单独操作时的结果是一样的。这就叫做并发控制。
并发控制的目的是保证一个用户的工作不会对另一个用户的工作产生不合理的影响。
没有做好并发控制,就可能导致脏读、幻读和不可重复读等问题。
二、分类
线程是否需要锁住共享的资源
-
悲观锁-- 锁住(synchronized、lock接口)
-
乐观锁 -- 不锁(原子类、并发容器等等)
多线程是否可以共享一把锁
-
共享锁 -- 可以(乐观锁的实现)
-
独占锁(排他锁) -- 不可(悲观锁的实现)
是否可中断
-
可中断锁 -- 可以
-
非可中断锁 -- 不可
同一线程多个流程能否重复获取同一把锁
-
可重入锁 -- 可以
-
不可重入锁 -- 不可
多线程竞争是否排队
-
公平锁 -- 排队(先进先拿)
-
非公平锁 -- 插队,失败再排
锁住同步资源失败,线程是否要阻塞
-
自旋锁 -- 循环等待,然后不断的尝试获取锁(自旋、适应性自旋)
-
非自旋锁 -- 阻塞
多个线程竞争同步资源的流程细节有没有区别
-
偏向锁 -- 同一个线程执行同步资源时自动获取资源(乐观锁的实现)
-
轻量级锁 -- 多个线程竞争同步资源时,没有获取资源的线程
自旋等待资源释放
(乐观锁的实现) -
重量级锁 -- 多个线程竞争同步资源时,没有获取资源的线程
阻塞等待唤醒
(悲观锁的实现)