首页
AI Coding
NEW
沸点
课程
直播
活动
AI刷题
APP
插件
搜索历史
清空
创作者中心
写文章
发沸点
写笔记
写代码
草稿箱
创作灵感
查看更多
会员
登录
注册
java并发编程
Lovely小猫
创建于2022-11-25
订阅专栏
java并发编程
等 2 人订阅
共34篇文章
创建于2022-11-25
订阅专栏
默认顺序
默认顺序
最早发布
最新发布
并发编程(三十四)未使用 Volatile 下的双重检查锁
如果此时发生指令重排序,那么有可能会执行顺序变成ACB,这样当线程1走到第7步ACB中的C步骤时,此时线程2也进来,假设线程2走到第4步时进行instance == null判断发现已经有对象了
并发编程(三十三)Volatile禁止指令重排序
在java文件编译成字节码时,volatile会在指令序列中加入内存屏障来禁止指令重排序。分为保守策略和不保守策略
并发编程(三十二)Volatile 使用的优化
Java并发编程大师Doug lea在JDK 7的并发包里新增一个队列集合类Linked-TransferQueue,它在使用volatile变量时,用一种追加字节的方式来优化队列出队和入队的性能
并发编程(三十一)Volatile 保证可见性
Lock前缀的指令在多核处理器下会引发了两件事情: 1)将当前处理器缓存行的数据写回到系统内存(主存。声言Lock信号。) 2)这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据无效。
并发编程(三十)Volatile 的定义
在并发编程中,volital和synchronize都扮演着很重要的角色。synchronize可以保证可见性、禁止指令重排序和原子性。而volital只能保证可见性和禁止指令重排序。
并发编程(二十九)内存屏障 happens-before 和 as-if-serial
StoreLoad Barriers是一个“全能型”的屏障,它同时具有其他3个屏障的效果。执行该屏障开销会很昂贵,因为当前处理器通常要把写缓冲区中的数据全部刷新到内存中。
并发编程(二十八)指令重排序
在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。重排序分3种类型:编译器优化的重排序,指令级并行的重排序,内存系统的重排序
并发编程(二十七)Java内存模型
Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。
并发编程(二十六)内核态和用户态
简单来说内核态就是操作系统运行线程,用户态就是线程执行用户自己的程序。简单来说内核态就是操作系统运行线程,用户态就是线程执行用户自己的程序。
并发编程(二十五)ObjectMonitor的属性
这一部分跟以后讲到的lock相关的内容非常相似,以后讲到lock希望能对比ObjectMonitor一起来记忆。 这一章节主要记忆几个重要属性和流程即可。
并发编程(二十四)死锁
死锁产生的四个必要条件: 互斥:一个资源每次只能被一个进程使用 (资源独立)。 请求与保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放 (不释放锁)。 不剥夺:进程已获得的资源,在未使用之前,
并发编程(二十三)Synchronized锁升级-Markword的转化过程
创建一个对象,此时对象里边没有hashcode,所以该对象可以使用我们的偏向锁,偏向锁不会考虑hashcode, 他会直接将自己的线程id放到我们的markword里边,不需要考虑后续的替换问题。
并发编程(二十二)Synchronized锁升级-轻量级锁升级为重量级锁
首先线程1访问同步代码块,此时还是无锁状态,所以给MarkWord中记录的是hashCode等信息。线程1使用CAS修改MarkWord,成功后这个锁成为轻量级锁,线程1分配空间并复制MarkWord
并发编程(二十一)Synchronized锁升级-轻量级锁加锁与解锁
线程在执行同步块之前,JVM会先在当前线程的栈桢中创建用于存储锁记录的空间(Lock Record记录),并将对象头中的Mark Word复制到锁记录中,官方称为Displaced Mark Word
并发编程(二十)Synchronized锁升级-偏向锁
偏向锁使用了一种等到竞争出现才释放锁的机制,所以当其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁。
并发编程(十九)Synchronized锁升级-偏向锁(下)-例5
**批量重偏向**: 当我们的一个对象,Object 类,在经过默认 20次的争抢的情况下,会将后边的所有争抢从新偏向争抢的线程。1. 当B线程争抢第 16 次的时候,触发了批量重偏向的阈值;
并发编程(十八)Synchronized锁升级-偏向锁(下)-例4
A线程获取偏向锁,并且A线程没有释放偏向锁(),还在syhnc的代码块里边。B线程多次争抢锁,会在加锁过程中采用重量级锁;但是,一旦锁被释放,当前对象还是会以轻量级锁的初始状态执行。这块算是锁降级吗?
并发编程(十七)Synchronized锁升级-偏向锁(下)-例3
A线程获取偏向锁,并且A线程没有释放偏向锁(),还在syhnc的代码块里边。B线程此时过来争抢偏向锁,会直接升级为重量级锁。
并发编程(十六)Synchronized锁升级-偏向锁(下)-例2
A线程获取偏向锁,并且A线程释放了锁,但是A线程并没有死亡还在活跃状态。B线程过来争抢,会直接升级为轻量级锁。
并发编程(十五)Synchronized锁升级-偏向锁(下)-例1
A线程获取偏向锁,并且A线程死亡退出。B线程争抢偏向锁,会直接升级当前对象的锁为轻量级锁。**这只是针对我们争抢了一次。**
下一页