synchronized

synchronized是Java控制多线程同步的,其实现是基于锁。

一 锁机制有两种特性

1. 互斥性

在同一时间内,一个对象锁只允许一个线程持有。互斥性往往也称为操作的原子性。

2. 可见性

在锁被释放之前,对共享变量所做的修改,对于随后获得该锁的另一个线程是可见的。

 

二 synchronized用法

1. 加在方法前面,用于同步方法

既可以同步静态方法,也可以同步非静态方法。

 

底层原理:设置ACC_SYNCHRONIZED标识

synchronized_第1张图片

2. 加在代码块上

synchronized(this|object) {}

synchronized(类.class) {}

 

底层原理:对象加锁

synchronized_第2张图片

synchronized_第3张图片

在 Java 中,每个对象都有一个 monitor 对象,monitor对象中有一个计数器。

  • 某一线程占有这个对象的时候,先检查monitor的计数器是不是0,如果是0则表示还没有线程占有,这个线程就可以占有这个对象,并且对这个对象的monitor+1;如果不为0,表示这个线程已经被其他线程占有,这个线程等待。当线程释放占有权的时候,monitor-1;
  • 同一线程可以对同一对象进行多次加锁,+1(具有重入性)

 

在JDK1.6之前synchronized使用重量级锁。JDK1.6开始做了优化,对锁根据条件逐步升级:偏向锁-》轻量级锁-》重量级锁

你可能感兴趣的:(Java)