Synchronized

原创
2016/08/27 14:54
阅读数 167

1、JavaSE 1.6 之前都认为synchronized是重量级锁,但是1.6进行了各种优化操作,所以并不是想象中那么重了,虽然synchronized的地方使用Lock都能实现,但是synchronized用处还是很广泛。

 

2、加锁的规则

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

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

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

 

3、访问synchronized标记的地方必须先获得锁,否则会阻塞在方法之外,退出或抛异常都是自动释放锁,让其他阻塞的线程竞争获取锁。

 

4、synchronized 保证共享变量的可见性和原子性

synchronized 实际上是对访问修改共享变量的代码块进行加互斥锁,多个线程对synchronized代码块的访问时,某一时刻仅仅有一个线程在访问和修改代码块中的内 容(加锁),其他所有的线程等待该线程离开代码块时(释放锁)才有机会进入synchronized代码块。所以某一个线程进入synchronized代码块前后,执行过程入如下:

1)当前线程获得互斥锁

2)清空工作内存(当前CPU的缓存副本)

3)从主内存拷贝共享变量最新的值到工作内存成为副本,保证共享变量的可见性

4)执行代码,一直持有锁,保证操作的原子性

5)将修改后的副本的值刷新回主内存中,通知其他CPU副本无效

6)代码块运行完成或抛出异常,线程释放锁

7)其他阻塞的线程从新竞争获取锁

8)其他线程进入synchronized代码块,然后重复1-8.

 

5. synchronized和volatile比较

1)volatile不需要同步操作,所以效率更高,不会阻塞线程,但是适用情况比较窄

2)synchronized既能保证共享变量可见性,也可以保证锁内操作的原子性;volatile只能保证可见性

 

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部