synchronized
一只渣渣
个人记录一些自己的工作所得,和学习中所遇见的问题以及浏览到的知识,如果有小伙伴看到我记录的文章欢迎指正出不足的地方,让我们一起进步,做一只悲催的程序猿(*^▽^*)
展开
-
并发系列—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 评论 -
并发系列—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 评论