锁
一只渣渣
个人记录一些自己的工作所得,和学习中所遇见的问题以及浏览到的知识,如果有小伙伴看到我记录的文章欢迎指正出不足的地方,让我们一起进步,做一只悲催的程序猿(*^▽^*)
展开
-
并发系列—volatile实现DCL单例模式
DCL单例模式:double check lock 单例模式public class DCLCompnent { private static volatile DCLCompnent instance; public static final DCLCompnent getInstance(){ if(null==instance){ ...原创 2020-03-24 12:42:29 · 134 阅读 · 0 评论 -
并发系列—volatile特性
特性:线程可见性 禁止指令重排序线程可见性:一个属性被多个线程同时调用,当属性的值发生改变其他线程能立刻读取到该属性的最新值(一般情况每个线程从cpu获取值之后会将值缓存到线程的内存中,之后从内存中读取(线程的内存是相互独立的)相关信息,这样就导致一个线程改变了属性值其他线程无法获得该属性值的最新值)。禁止指令重排序:一个方法正常由多行代码执行完成,在jvm编译方法的时候检测,...原创 2020-03-24 12:07:27 · 138 阅读 · 0 评论 -
并发系列—synchronized与lock(CAS)比较
大量线程争抢资源、髙耗时的环境下synchronized效率更高synchronized在重量锁时会将部分线程放入睡眠队列,不消耗cpu少量线程争抢资源、少耗时的环境下CAS效率更高CAS等待期间一直消耗cpu...原创 2020-03-23 23:21:09 · 296 阅读 · 0 评论 -
并发系列—synchronized锁消除
我们知道 StringBuffer 是线程安全的,因为它的关键方法都是被synchronized修饰过的,但参考下面这段代码,会发现,sb 这个引用只会在 add 方法中使用,不可能被其它线程引用(因为是局部变量,栈私有),因此 sb 是不可能共享的资源,JVM 会自动消除 StringBuffer 对象内部的锁。public void add(String str1,String str2...原创 2020-03-23 23:15:07 · 381 阅读 · 0 评论 -
并发系列—synchronized锁粗化
JVM检测到一连串的操作都对同一个对象加锁(while循环内执行100次append,没有锁粗化的就要进行100次加锁/解锁),此时 JVM 就会将加锁的范围粗化到这一连串的操作的外部(比如 while 虚幻体外),使得这一连串操作只需要加一次锁即可。StringBuffer sb = new StringBuffer();int i=0;while(i<100){ //重...原创 2020-03-23 23:09:32 · 397 阅读 · 0 评论 -
并发系列—synchronized锁升级流程
【PS:该文章为个人学习总结,尚不完善仅供参考】无锁:对象初始化状态偏向锁:对象内存的heard中记录Markdown并将Markdown信息给到cpu作为标识,每次cpu识别到线程的Markdown与自己保存的一致,就让该线程执行(此时并未实际加锁)轻量级锁:进入synchronized代码块后线程中对象锁升级为轻量级锁(线程竞争量较少的情况下)重量级锁:大量线程同时抢占一把锁,...原创 2020-03-23 22:57:44 · 140 阅读 · 0 评论 -
并发系列—synchronized锁升级状态
锁升级过程:无锁 ==》偏向锁 ==》轻量级锁==》重量级锁锁状态对应内存中头部信息第一排第一段的后三位(有的状态是后两位)无锁:001 偏向锁:101 轻量级锁:00 重量级锁:10使用JOL查看对象内存信息Person person = new Person();System.out.println(ClassLayout.parseInstance(person).t...原创 2020-03-23 22:32:53 · 129 阅读 · 0 评论 -
并发系列—JOL
JOL:Java Object Layout,是一款工具,可以帮助我们查看对象的内存信息。1、pom.xml<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.9&l...原创 2020-03-23 19:03:32 · 632 阅读 · 0 评论 -
并发系列—CAS原理实现初识
在JDK1.5开始,AtomicInteger中就基于CAS原理做了相关操作。public static void main(String[] args) throws Exception{ //初识值为0 AtomicInteger atomicInteger = new AtomicInteger(); //查看当前对象的值 ...原创 2020-03-22 18:14:50 · 102 阅读 · 0 评论 -
并发系列—CAS之ABA问题
上篇文章通过自旋锁保证了数据的准确性,现在我们讨论一个问题。【PS:看这个问题前需要确保已经明白自旋锁的执行原理】业务:获取对象名称,根据名称对数据进行相关处理。如图:【上图我们发现并发时使用CAS处理业务可能会因多条线程同时操作导致某些业务被重复操作,出现ABA问题】QA:如何解决CAS的ABA问题?思路:使用版本号控制(例:mysql的乐观锁)定义一个字段用于存...原创 2020-03-22 16:12:35 · 174 阅读 · 0 评论 -
并发系列—CAS初识
CAS(Compare And Swap)锁的一种,可以称为自旋锁。与我们知道的synchronized、lock其本质区别是CAS并没有像其他两种一样真正将这个对象锁住而是通过不断获取原有值然后进行比较的方式去保证数据的正确性,如其名称的直译【比较与交换】。例:3个线程同时操作一个对象的属性(age)。age=0;现在3个线程都对age进行操作(每次对当前值+1,每个线程都是操作1...原创 2020-03-22 00:13:41 · 167 阅读 · 0 评论