Java中的两个同步方法(同一个Object)如何同时运行?

问题描述 投票:0回答:1

我在网上搜索 wait() 和 notify() 的例子,找到了下面的例子。 在下面的代码块中,getValue() 和 setValue 方法都是同步的。如果我创建两个线程并且第一个线程获得锁,第二个线程是否会无限期地等待,直到第一个线程释放锁?所以不可能同时运行 getValue() 和 setValue() 吗?如果是, wait() 和 notify() 方法将一无所获。

tldr:如何同时从不同线程调用 getValue() 和 setValue() 方法?

public class Data {
    private int value;
    private boolean available = false;

    public synchronized int getValue() {
        while (!available) {
            try {
                wait();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
        available = false;
        notifyAll();
        return value;
    }

    public synchronized void setValue(int value) {
        while (available) {
            try {
                wait();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
        this.value = value;
        available = true;
        notifyAll();
    }
}
java multithreading java-threads
1个回答
0
投票

引用Object.wait的文档:

此方法导致当前线程(称为 T)将自身置于该对象的等待集中,然后放弃对该对象的任何和所有同步声明。

本质上,wait是一种特殊情况,允许其他线程在收到通知之前申请锁。

© www.soinside.com 2019 - 2024. All rights reserved.