synchronized

2020-06-01  本文已影响0人  markeNick

synchronized关键字用于为Java对象、方法、代码块提供线程安全的操作。synchronized属于独占式的悲观锁,同时也属于可重入锁。

使用synchronized修饰对象时,同一时刻只能有一个线程对该对象进行访问;

使用synchronized修饰方法、代码块时,同一个时刻只能有一个线程执行该方法或代码块;

Java中的每个对象都有一个monitor对象,加锁就是在竞争monitor对象。对代码块加锁是通过在前后分别加上monitorenter和monitorexit指令实现的,对方法是否加锁是通过一个标志位来判断的。

synchronized的作用范围

轻量级锁加锁流程:

锁膨胀

当Thread-2进行轻量级加锁时,Thread-1已经对该对象加了轻量级锁了,这个时候Thread-1加轻量级锁失败,就进入锁膨胀流程

偏向锁

轻量级锁在重入的时候,每次都要进行CAS操作,会消耗CPU性能。

在Java 6中引入了偏向锁来做进一步的优化:只有第一次使用CAS的时候将线程ID设置到对象头的Mark Word中,之后重入的时候,发现线程ID是自己就表示是自己,不用重新CAS。

偏向锁流程:

上一篇 下一篇

猜你喜欢

热点阅读