synchronized是Java控制多线程同步的,其实现是基于锁。
一 锁机制有两种特性
1. 互斥性
在同一时间内,一个对象锁只允许一个线程持有。互斥性往往也称为操作的原子性。
2. 可见性
在锁被释放之前,对共享变量所做的修改,对于随后获得该锁的另一个线程是可见的。
二 synchronized用法
1. 加在方法前面,用于同步方法
既可以同步静态方法,也可以同步非静态方法。
底层原理:设置ACC_SYNCHRONIZED标识
2. 加在代码块上
synchronized(this|object) {}
synchronized(类.class) {}
底层原理:对象加锁
在 Java 中,每个对象都有一个 monitor 对象,monitor对象中有一个计数器。
- 某一线程占有这个对象的时候,先检查monitor的计数器是不是0,如果是0则表示还没有线程占有,这个线程就可以占有这个对象,并且对这个对象的monitor+1;如果不为0,表示这个线程已经被其他线程占有,这个线程等待。当线程释放占有权的时候,monitor-1;
- 同一线程可以对同一对象进行多次加锁,+1(具有重入性)
在JDK1.6之前synchronized使用重量级锁。JDK1.6开始做了优化,对锁根据条件逐步升级:偏向锁-》轻量级锁-》重量级锁