一、概念
synchronized是Java的关键字,它提供一种排他机制,使得在同一时间内只能有一个线程去操作去操作synchornized封装的代码块或者方法。
二、用法:
同步方法锁定的是当前对象。当多线程通过同一个对象引用多次调用当前同步方法时,需同步执行。也就是说当一个线程访问同步方法时,其他线程访问这个方法将会被阻塞(等待锁)。
1.同步方法
同步成员方法
public synchornized void func(){}
同步静态方法
public synchornized static void func(){}
2.同步代码块
- 同步代码块在执行时,是锁定 object对象。当多个线程调用同一个方法时,锁定对象不变的情况下,需同步执行。
- 同步代码块的同步粒度更加细致,可以定位到具体的同步位置,而不是简单的将方法整体实现同步逻辑。在效率上,比同步方法更高。
private final Object lock = new Object();
public void func(){
synchornized(lock){
...
}
}
三、使用场景
- 两个线程同时访问同一个对象的同步方法 安全
- 两个线程同时访问两个对象的同步方法 (不安全)
- 两个线程**同时访问(一个或两个)**对象的静态同步方法 (安全)
- 两个线程**分别同时访问(一个或两个)**对象的同步方法和非同步方法。(不安全)
- 两个线程访问同一个对象中的同步方法,同步方法又调用另外一个非同步方法 不安全
- 两个线程同时访问同一个对象的不同的同步方法 安全
- 两个线程同时访问静态synchronized和非静态synchornized方法 不安全
- 同步方法抛出异常,JVM会自动释放锁