锁分析 Lock
锁分析
Lock
NonReentrantLock
ReadLock 共享锁
ReentrantLock 重入锁 排他锁
sync.lock 返回值为void,表示如无异常发生都认为锁获取成功
FairSync.lock 公平锁
FairSync.tryAcquire
获取线程
获取线程重入次数
重入次数为0
是 也就是第一次获取锁
在队列头部(队列为空或者当前线程在队列头部)
获取锁 设置锁状态 重入次数
设置锁的独占线程
获取锁成功
否
当前线程是否是锁的独占线程
是
重入次数+1 成功获取锁
否
获取锁失败
NonfairSync.lock 非公平锁
NonfairSync.lock
按照假设当前线程是第一次获取锁来申请锁
成功
设置当前线程为锁的独占线程
失败
按照重入的方式获取锁
WriteLock 排他锁 CAS 存在ABA的问题
ReentrantLock 重入锁默认构造是非公平锁实现,当申请锁的线程刚好碰到正在执行的线程释放了锁,那么他就有机会直接获取到锁,而不用排队。 重入锁的公平锁实现原理:
如果当前线程第一次获取锁,如果当前线程在抽象队列同步执行器的队首位置,利用CAS原理修改线程重入次数为1,成功则修改锁的独占线程为当前线程。
如果当前线程不是第一次获取锁,那么判断当前锁的独占线程与当前获取锁的线程是否一致,如果一致那么获取锁成功。 重入锁的非公平锁实现原理:
尝试按照第一次获取锁的方式直接获取锁,成功则获取锁成功
失败则重入的方式获取锁(判断当前线程与锁的独占锁是否一致)
Lock本地锁应用场景
根据锁创建的位置可以分为,对象锁,全局锁
1、对象锁,对象持有锁,在并发访问对象资源时可以用该锁控制。
public class ObjectLock {
private Lock objectLock = new ReentrantLock();
void objectLock(Ticket ticket) {
objectLock.lock();
try {
System.out.println(Thread.currentThread().getName()+":"+ticket.getNum());
ticket.setNum(ticket.getNum()+1);
Thread.sleep(1000);
} catch (Exception e) {
Console.error(e);
} finally {
objectLock.unlock();
}
}
}
2、全局锁,创建一个静态常量的锁,在系统全局都可以使用该锁。
public interface LockConstant {
Lock lock = new ReentrantLock();
}
void lockConstant(Ticket ticket) {
Lock lock = LockConstant.lock;
lock.lock();
try {
System.out.println(Thread.currentThread().getName()+":"+ticket.getNum());
ticket.setNum(ticket.getNum()+1);
Thread.sleep(100);
} catch (Exception e) {
Console.error(e);
} finally {
lock.unlock();
}
}
锁分析 Lock的更多相关文章
- Redisson分布式锁学习总结:可重入锁 RedissonLock#lock 获取锁源码分析
原文:Redisson分布式锁学习总结:可重入锁 RedissonLock#lock 获取锁源码分析 一.RedissonLock#lock 源码分析 1.根据锁key计算出 slot,一个slot对 ...
- 【转】锁(lock)知识及锁应用
sql server锁(lock)知识及锁应用转自:http://blog.csdn.net/huwei2003/article/details/4047191 关键词:锁提示,锁应用 提示:这里所摘 ...
- java里的锁总结(synchronized隐式锁、Lock显式锁、volatile、CAS)
一.介绍 首先, java 的锁分为两类: 第一类是 synchronized 同步关键字,这个关键字属于隐式的锁,是 jvm 层面实现,使用的时候看不见: 第二类是在 jdk5 后增加的 Lock ...
- 【python】多进程锁multiprocess.Lock
[python]多进程锁multiprocess.Lock 2013-09-13 13:48 11613人阅读 评论(2) 收藏 举报 分类: Python(38) 同步的方法基本与多线程相同. ...
- 锁机制(Lock) 信号量机制(Semaphore) 事件机制(Event)
IPC 进程间通信(inter-Process Communicate) 锁机制(Lock) l = Lock() 开启一个锁机制(实例化) 一把锁配一个钥匙 l.acquire() 获得钥匙 ...
- Synchronized和Lock, 以及自旋锁 Spin Lock, Ticket Spin Lock, MCS Spin Lock, CLH Spin Lock
Synchronized和Lock synchronized是一个关键字, Lock是一个接口, 对应有多种实现. 使用synchronized进行同步和使用Lock进行同步的区别 使用synchro ...
- 自旋锁Spin lock与互斥锁Mutex的区别
POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API.线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用 ...
- 同步锁之lock
一. synchronized的缺陷 当一个代码块被synchronized修饰时,同时该代码块被一个线程执行,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况: ...
- Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)
多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...
随机推荐
- IntelliJ IDEA配置tomcat 教程
1.点击Run-Edit Configurations... 2.点击左侧"+",选择Tomcat Server--Local 3.在Tomcat Server -> Unn ...
- 一次线上事故,让我对MySql的时间戳存char(10)还是int(10)有了全新的认识
美好的周五 周五的早晨,一切都是那么美好. 然鹅,10点多的时候,运营小哥哥突然告诉我后台打不开了,我怀着一颗"有什么大不了的,估计又是(S)(B)不会连wifi"的心情,自信的打 ...
- kubernetes技能图谱
深入剖析Kubernetes-张磊(Kubernetes社区资深成员与项目维护者) Kubernetes集群搭建 ver1.20.5
- lua table的遍历
--ordered table iterator sorted by key function pairsByKeys(t) local a = {} for n in pairs(t) do a[# ...
- 本地软件仓库配置及NFS安装
[root@localhost ~]# mount /dev/cdrom /mnt mount: /dev/sr0 is write-protected, mounting read-only [ro ...
- Azure DevOps(二)利用Azure DevOps Pipeline 构建基础设施资源
一,引言 上一篇文章记录了利用 Azure DevOps 跨云进行构建 Docker images,并且将构建好的 Docker Images 推送到 AWS 的 ECR 中.今天我们继续讲解 Azu ...
- GPU上的基本线性代数
GPU上的基本线性代数 cuBLAS库提供了基本线性代数子例程(BLAS)的GPU加速实现.cuBLAS通过针对NVIDIA GPU进行了高度优化的嵌入式行业标准BLAS API来加速AI和HPC应用 ...
- 使用Auto TensorCore CodeGen优化Matmul
使用Auto TensorCore CodeGen优化Matmul 本文将演示如何使用TVM Auto TensorCore CodeGen在Volta / Turing GPU上编写高性能matmu ...
- 如何为应用选择最佳的FPGA(下)
如何为应用选择最佳的FPGA(下) How to select an FPGA board? FPGA板的选择在很大程度上受FPGA本身的影响,也受整个板的特性和性能的影响.们已经在上面的章节中讨论了 ...
- Contos8 安装 MariaDb 时报错:Could not open mysql.plugin table: table mysql.plugin
导语: 因个人服务器误删了一些文件导致MariaDB崩溃,一直在报错,所以想着重装一下,没想到在重装后启动时再次报错(与之前报错不同),这次的报错原因大致是因为某些插件表找不到. 因此又开启了漫长的寻 ...