一
synchronized修饰的代码具有原子性,
这种原子性的实现是:多个线程要获取对象的monitor才可以执行代码。
使用synchronized时,到底是获取哪个对象的monitor呢?
分两种情况:
-
显式:
synchronized(""){ ...}
-
隐式:
public synchronized void m1(){...}
public static synchronized void m2(){ ...}
二、测试
package test;
public class Syn {
// 打印0
public static synchronized void m0(){ // 需要获取类模板对象的monitor
System.out.println(Thread.currentThread().getName()+": 0");
Syn.class.notify(); // 唤醒
try {
Syn.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void m1(){// 需要获取对象的monitor
System.out.println(Thread.currentThread().getName()+": 1");
this.notify(); // 唤醒
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package test;
public class Main {
public static void main(String[] args) {
Syn syn = new Syn();
new Thread(() -> {
for (int i = 0; i < 10 ; i++) {
syn.m0(); // 执行这个方法时,需要先获取锁
}
}).start();
new Thread(() -> {
for (int i = 0; i < 10 ; i++) {
syn.m1();// 执行这个方法时,需要先获取锁
}
}).start();
}
}
三、小结
- 看到synchronized,首先弄清楚,需要获取的锁对象