synchronized实现的个人体会
2018-10-30 本文已影响9人
huangxiongbiao
1、synchronized同步关键字总述
jdk1.5之前 synchronized的同步依靠的是
系统内核的互斥同步
实现的。对于阻塞的实现需要在内核中完成线程的挂起和恢复
。严重影响了同步的并发性能
在jdk1.6实现了很多锁优化技术。如自旋锁,锁消除,锁粗化,轻量锁,和偏向锁
。
2、简述自旋锁,锁消除,锁粗化,轻量锁,和偏向锁
(1)自旋锁
原理其实就是一个忙循环,循环等待。这种操作占用cpu时钟,在长时间阻塞中会影响计算机性能。所有jvm设置的是10个忙循环为获得锁会转入重量锁及互斥同步。忙循环次数可以自己用指令设置-XX:PreBlockSpin
(2)锁消除
锁消除jvm编译时,判断有些代码不需要同步的会自动去掉同步锁,以免造成浪费
(3)锁粗化
锁粗化 在一个循环内加锁循环加锁,jvm编译时能够将锁已到循环外避免锁重复
(4)轻量锁
轻量锁在没有并发竞争的时候使用,获取锁时将对象头部的锁标识设置为已锁定。如果有锁来竞争,先使用自旋锁等待。若在一定次数内未获得相关锁,在转入重量锁。尽可能的避免互斥锁的使用,影响并发性能
(5)偏向锁
第一次获取锁对象头设置为偏向锁状态,存入线程id。在无竞争情况下,后续进入该线程无需任何操作。在有线程来竞争时,取消偏向锁状态后续操作和轻量锁类似