【问题标题】:Class level locking with synchronization block, multiple threads on same instance具有同步块的类级锁定,同一实例上的多个线程
【发布时间】:2021-09-16 06:59:24
【问题描述】:

我有以下代码,其中多个线程正在调用由静态对象保护的相同实例方法

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”会打印两次,即使块已同步。

【问题讨论】:

    标签: java synchronization


    【解决方案1】:

    第一个线程获取锁,打印Before A,第二个线程现在被阻塞。然后第一个线程调用wait(调用wait后,线程失去对锁的控制,进入等待状态),第二个线程获取锁,打印Before A,第二个线程调用wait。 (两个线程都处于Waiting 状态,)。然后主线程获取锁,然后通知两个线程。

    下图表示线程在任何时刻的各种状态。

    【讨论】:

    • 谢谢,我想念关于等待的文档。
    猜你喜欢
    • 2017-05-03
    • 1970-01-01
    • 2017-05-15
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    相关资源
    最近更新 更多