Java并发编程的艺术(三)synchronized的应用

1、利用synchronized实现同步的基础:Java中的每一个对象都可以作为

(1)对于普通同步方法,锁是当前实例对象

(2)对于静态同步方法,锁是当前类的Class对象

(3)对于同步方法块,锁是Synchronized括号里配置的对象

 

2、synchronized在JVM中的实现原理:JVM基于进入和退出Monitor对象来实现方法同步代码块同步。任何对象都有一个monitor与之关联。

 

3、synchronized用的锁是存在Java对象头中的Mark Word里,Mark Word默认存储对象的HashCode、分代年龄和锁标志位,在运行期间Mark Word里存储的数据会随着锁标志位的变化而变化,长度由虚拟机位数决定(32/64bit)。

 

4、JavaSE1.6中锁分为4种状态(级别从低到高):无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,锁可以升级但不能降级,目的是为了提高获取锁和释放锁的效率。

 

5、锁的优缺点对比

优点 缺点 适用场景
偏向锁 加锁和解锁不需要额外的消耗,和执行非同步方法相比仅存在纳秒级的差距 如果线程间存在锁竞争,会带来额外的锁撤销的消耗 适用于只有一个线程访问同步块场景
轻量级锁 竞争的线程不会阻塞,提高了程序的响应速度 如果始终得不到锁竞争的线程,使用自旋会消耗CPU 追求响应时间,同板块执行速度非常快
重量级锁 线程竞争不使用自旋,不会消耗CPU 线程阻塞,响应时间缓慢 追求吞吐量,同步块执行速度较长

 

6、synchronized的使用方式有两种:

(1)同步方法:使用ACC_SYNCHRONIZED标记符隐式的对方法进行加锁,当某个线程要访问某个方法的时候,需要先获得监视器锁,然后开始执行方法,方法执行之后再释放监视器锁。

(2)同步代码块:使用monitorenter加锁和monitorexit释放锁的两个指令实现。

posted on 2019-07-20 11:07  逍遥1989  阅读(112)  评论(0编辑  收藏  举报