java 锁
2021-06-27 18:33:18 1 举报
AI智能生成
java锁事
作者其他创作
大纲/内容
基本概念
锁 锁是多线程的一种同步机制,对线程访问的资源权限控制,实现并发策略
锁竞争 就是一个线程想要获取另一个线程持有的锁
锁开销 指锁占内存、cup创建、cpu销毁、获取锁、释放锁的消耗
死锁 至少有2个线程互相等待另一个线程的锁,例如A\B2个线程,A等待B线程持有的锁b才能释放锁a,但是线程B需要先获得锁a才能释放锁b
加锁的粒度 指的是加锁的资源范围
实现算法
CAS比较和交换
原理:读取数据为A,在将A更新为B之前,先检查是否和A(比较)相同,如果是则更新为B,如果不是则什么都不做
问题:ABA问题,a线程读取数据A之后,b线程将数据由A更新成B,再更新为A',那么CAS认为A'还是和A一样的
加版本号
AtomicMarkableReference/AtomicStampedReference
AQS
抽象队列同步器 AbstractQueuedLongSynchonizer/AbstractQueuedSynchonizer
实现原理 资源(state)+FIFO线程等待队列
资源共享方式
独占
共享
分类
要不要锁住同步资源
悲观锁 认为在读取数据的时候其他线程会进行修改,所以它在读取的时候也会加锁,悲观加锁阻塞事物,即悲观锁会锁住同步资源
乐观锁 在读数据的时候认为其他线程不会对数据修改,在更新数据的时候会先查看其他线程是否更改数据,如果是,则重新读取数据修改,再次尝试修改,循环判断直到修改成功。即乐观锁不会锁住同步资源
锁住同步资源时失败,要不要阻塞
阻塞
不阻塞
自旋锁 获取锁的过程通过循环的方式获取锁
多线程竞争资源的流程细节区别
无锁 不锁住资源,只有一个线程能够修改成功,其他线程重试
偏向锁 同一线程执行同步资源时自动获取资源
轻量级锁 多线程访问同步资源时,没有获取到资源的线程自旋等待锁的释放
重量级锁 多个线程访问同步资源时,没有获取到资源的线程阻塞等待唤醒
多线程竞争需不需要排队
公平锁 多线程排队申请锁
非公平锁 后申请的线程尝试插队,失败后再排队
一个线程内流程能发重复获取同一把锁
可重入锁 一个线程内的多个流程可以重复的获取同一把锁
不可重入锁 一个线程内的多个流程不能重复的获取同一把锁
多线程能不能获取同一把锁
独享锁 也称排他锁、互斥锁,即只能有一个线程拥有该锁
共享锁 可以多个线程拥有这个锁
收藏
收藏
0 条评论
下一页