Class 带同步块的级别锁定,同一实例上的多个线程
Class level locking with synchronization block, multiple threads on same instance
我有以下代码,其中多个线程正在调用由静态对象保护的相同实例方法
package com.data;
class TestThread {
private final static Object object = new Object();
public void myWaitMethod() {
synchronized (object) {
System.out.println("Before a " + Thread.currentThread().getId());
try {
object.wait();
} catch (Exception ignore) {
System.out.println(Thread.currentThread().getId());
}
System.out.println("After a " + Thread.currentThread().getId());
}
}
public void myNotifyMethod() {
synchronized (object) {
System.out.println("Before Notify");
object.notifyAll();
System.out.println("After b");
}
}
public static void main(String[] args) throws InterruptedException {
TestThread aa1 = new TestThread();
new Thread(() -> aa1.myWaitMethod()).start();
new Thread(() -> aa1.myWaitMethod()).start();
Thread.sleep(1000);
System.out.println("sleep");
Thread.sleep(1000);
aa1.myNotifyMethod();
}
}
o/p:
Before a 12
Before a 13
sleep
Before Notify
After b
After a 13
After a 12
我不明白为什么“Before a”两次打印,即使块是同步的。
第一个线程获取锁,打印Before A
,第二个线程现在被阻塞。然后第一个线程调用wait
(调用wait后线程失去对锁的控制,进入等待状态),第二个线程获取锁,打印Before A
,第二个线程调用wait。 (两个线程都处于 Waiting
状态,)。然后主线程获取锁,然后通知两个线程。
下图表示线程在任何时刻的各种状态。
我有以下代码,其中多个线程正在调用由静态对象保护的相同实例方法
package com.data;
class TestThread {
private final static Object object = new Object();
public void myWaitMethod() {
synchronized (object) {
System.out.println("Before a " + Thread.currentThread().getId());
try {
object.wait();
} catch (Exception ignore) {
System.out.println(Thread.currentThread().getId());
}
System.out.println("After a " + Thread.currentThread().getId());
}
}
public void myNotifyMethod() {
synchronized (object) {
System.out.println("Before Notify");
object.notifyAll();
System.out.println("After b");
}
}
public static void main(String[] args) throws InterruptedException {
TestThread aa1 = new TestThread();
new Thread(() -> aa1.myWaitMethod()).start();
new Thread(() -> aa1.myWaitMethod()).start();
Thread.sleep(1000);
System.out.println("sleep");
Thread.sleep(1000);
aa1.myNotifyMethod();
}
}
o/p:
Before a 12
Before a 13
sleep
Before Notify
After b
After a 13
After a 12
我不明白为什么“Before a”两次打印,即使块是同步的。
第一个线程获取锁,打印Before A
,第二个线程现在被阻塞。然后第一个线程调用wait
(调用wait后线程失去对锁的控制,进入等待状态),第二个线程获取锁,打印Before A
,第二个线程调用wait。 (两个线程都处于 Waiting
状态,)。然后主线程获取锁,然后通知两个线程。
下图表示线程在任何时刻的各种状态。