TIP
下面这段Demo证明了锁定this对象和锁定自定义对象是独立不冲突的
package com.mrzhang.javalearn.bingfa.demo_02;
import java.util.concurrent.TimeUnit;
/**
* Synchronized基本使用(五)
* <p>
* 1. 两个线程锁一个对象了,就排队等着
* 2. 没锁同一个对象就各自独立,什么都没锁就更独立了
*
* @author 91MrZhang on 2020/7/31
*/
public class SynchronizedDemo05 {
private final Object lock = new Object();
public synchronized void m1() {
System.out.println("m1准备工作3秒");
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("m1已经工作完3秒");
}
public synchronized void m2() {
System.out.println("m2准备工作5秒");
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("m2已经工作完5秒");
}
public void m3() {
synchronized (lock) {
System.out.println("m3准备工作4秒");
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("m3已经工作完4秒");
}
}
public void m4() {
System.out.println("m4准备工作1秒");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("m4已经工作完1秒");
}
public static void main(String[] args) {
SynchronizedDemo05 sd05 = new SynchronizedDemo05();
new Thread(sd05::m1, "线程1号").start();
new Thread(sd05::m2, "线程2号").start();
new Thread(sd05::m3, "线程3号").start();
new Thread(sd05::m4, "线程4号").start();
}
}