java并发编程艺术笔记1

1.偏向锁,顾名思义就是偏心的意思,当一个线程访问同步块时,会在该对象头增加自己偏向锁的线程ID,以后进入该对象就可以直接进入不需要通过cas 对对象头进行加锁和解锁

偏向锁的执行流程,如,线程1 执行同步块,检查对象头的位置是否存在当前的线程ID,有就直接进入,如果没有,就cas 替换掉mark head 对象头,将对象头的偏向锁的线程ID设置为自己的,然后执行同步体,如果此时也线程2也进来,也会执行线程1的步骤,如果通过CAS替换mark head 失败时,就会撤销偏向锁,暂停线程1,解锁,将对象头的偏向锁设为空,然后恢复线程,大家就开始竞争了,此时偏向锁就变成了轻量级锁,升级了,锁只能升级不能降级,优先级依次为:无锁->偏向锁->轻量级锁->重量级锁

2.轻量级锁就是自旋锁,线程再进入同步块,jvm 会在当前线程的栈帧创建用于记录锁的空间,并将对象头的mark word 复制到当前空间来,然后线程通过cas 操作将对象头中的mark word 替换成指向锁记录的指针,如果成功就是获得对象锁,如果失败,说明有其他线程竞争锁,当前线程尝试使用自旋来获取锁,如果通过自旋一直失败,就将锁升级为重量级锁

具体的流程,线程1 访问同步块时时,jvm 会分配用于记录存储锁的空间,并将对象头复制到当前存储锁的空间,通过cas 来修改对象头的指向锁记录的指针,如果成功将对象头替换成轻量级锁,执行同步体,如果失败了,说明有竞争,释放锁并唤醒等待线程,变成重量级锁,大家一起竞争,此时如果有线程执行以上步骤,在进行cas mark word 时失败会自旋,继续执行操作,等自旋不成功时,将锁修改成重量级锁,然后进入阻塞当前线程进入对待队列,等待唤醒,轻量级锁的优点是:在线程竞争不激烈时,不需要将线程挂起,唤醒步骤,不需要进行上下文切换,因为上下文切换需要耗费时间,可能比线程执行同步代码块的时间长,缺点是:线程自旋,浪费cpu 时间

所以偏向锁和轻量级锁适用于锁竞争不激烈的场合,如果竞争激烈,不适合。会浪费大量CPU资源

3.原子操作的实现原理

 原子本意:不能被进一步分割的最小粒子,原子操作就是不能分割,或者中断的一系列操作,

猜你喜欢

转载自lliang54.iteye.com/blog/2386178
今日推荐