Syn与volatile
2019-09-21 17:01:37 11 举报
并发小知识
作者其他创作
大纲/内容
暂停有锁线程,并返回全局安全点
和轻量级锁的区别:如果一个线程获取不到锁,会直接阻塞。
是
保证原子性,可见性,有序性
Monitor对象:在字节码中插入指令monitorentermonitorexit
1.在线程JVM的栈中开辟一块锁记录空间(lockRecord)。用来存储锁信息。2、将锁信息(MarkWord)复制到栈中的锁记录空间中。3.将锁信息(MarkWord)设为指向锁记录空间的指针。
轻量级锁加锁过程
将线程ID设为自己,并将是否为偏向锁标志设为1.
线程每次修改volatile变量,都会立刻刷新到主存中。然后只要有其它线程使用该变量的时候,就会失效自己cpu缓存中的原来值,重新从主存读取新值。
CAS操作
用内存屏障实现xolatile变量的操作顺序限制。不能将在对volatile变量访问的语句放在其后面执行,也不能把volatile变量后面的语句放到其前面执行
重量级锁
volatile
保证原子性
对象头的MarkWord
否
膨胀为轻量价锁
将线程设为无锁状态
适用于同步代码快执行快的场景
轻量级锁
禁止指令重排
AKA:自旋锁,乐观锁,非阻塞同步锁
加锁是否成功
自旋:不断的申请获取锁。这时候该申请锁的线程并没有被阻塞。故可以减少将阻塞线程唤醒的操作系统消耗。缺点是会不断消耗cou
synchronized
内存可见性
阻塞或者唤醒一个线程时,都需要操作系统来帮忙,这就需要从用户态转换到内核态
存在其它线程竞争
这里要注意的是每次使用,如果没有使用就不会刷新
锁状态 hashcode 分代年龄 是否为偏性锁 锁标志位 偏向线程ID
大吉大利
唤醒原线程
保证有序性
自旋超过固定次数还没有成功加锁,那就将锁升级为重量级锁
优点:单线程访问同步代码块时,减少锁释放和获取的开销
保证有序性,可见性。不保证原子性常用在原子操作中,作为状态标志位
检查同步代码块是否执行完
实现原理:对象头中的MarkWord
锁
互斥锁
偏向锁
收藏
0 条评论
下一页