这边是一个简单的线程调用
public class SynchronizedThis {
public static void main(String[] args) {
ThisLock thisLock = new ThisLock();
new Thread("T1") {
@Override
public void run() {
thisLock.m1();
}
}.start();
new Thread("T2") {
@Override
public void run() {
thisLock.m2();
}
}.start();
}
}
class ThisLock {
public void m1() {
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void m2() {
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
从输出可以看出T1,T2是同时输出的,下面加上sychronized改造一下
class ThisLock {
private final Object LOCK = new Object();
public void m1() {
synchronized(this) {
System.out.println(this.getClass().getName());
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void m2() {
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
发现这两个锁的是同一个东西,所以一个先输出一个后输出
class ThisLock {
private final Object LOCK = new Object();
public void m1() {
synchronized(LOCK) {
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void m2() {
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
最后锁的是一个对象,然后输出发现是同时输出的,说明是两个不同的锁,一个是LOCK锁,一个是this锁