// 锁的是对象,不是代码
public class T {
private int count = 10;
private Object o = new Object();
public void m() {
// 任何线程要执行下面的代码,必须先拿到 o 的锁,只有拿到 o 这把锁,才能执行下面这段代码。
// 一旦 A 线程拿到这把锁,B 线程只有等 A 线程执行完,释放了 o 这把锁,B 再获取这把锁,B 线程才能执行。
synchronized (o) {
count--;
System.out.println(Thread.currentThread().getName() + " count = " + count);
}
}
}
二 用当前对象当锁
public class T {
private int count = 10;
public void m() {
// 锁的是 this
synchronized (this) { // 任何线程要执行下面的代码,必须先拿到 this 的锁,用当前对象当锁
count--;
System.out.println(Thread.currentThread().getName() + " count = " + count);
}
}
}
三 在方法前加 synchronized
public class T {
private int count = 10;
public synchronized void m() { // 等同于在方法代码执行时加 synchronized(this)
count--;
System.out.println(Thread.currentThread().getName() + " count = " + count);
}
}
四 静态方法前加 synchronized
public class T {
private static int count = 10;
// 锁的是 XX.class
public synchronized static void m() { // 这里等同于 synchronized(T.class)
count--;
System.out.println(Thread.currentThread().getName() + " count = " + count);
}
public static void mm() {
synchronized (T.class) { // 这里不能写成 synchronized(this)
count--;
}
}
}
五 synchronized 的小测试
1 代码
public class T implements Runnable {
private /*volatile*/ int count = 100;
public synchronized void run() { // 必须加 synchronized ,否则两个不同的线程可能会输出相同的值
count--;
System.out.println(Thread.currentThread().getName() + "