这个问题是在一次采访中被问到的。在我告诉他之前,



考虑片段:

Q1:

public class Q1 {
    int n;
    boolean valueSet = false;

    synchronized int get() {
        while (!valueSet)
            try {
                wait();
            } catch (InterruptedException e) {
                System.out.println("InterruptedException caught");
            }
        System.out.println("Got: " + n);
        valueSet = false;
        notify();
        return n;
    }

    synchronized void put(int n) {
        while (valueSet)
            try {
                wait();
            } catch (InterruptedException e) {
                System.out.println("InterruptedException caught");
            }
        this.n = n;
        valueSet = true;
        System.out.println("Put: " + n);
        notify();
    }
}

Producer1:
public class Producer1 implements Runnable {

    Q1 q;

    Producer1(Q1 q) {
        this.q = q;
        new Thread(this, "Producer").start();
    }

    @Override
    public void run() {

        int i = 0;
        while (true) {
            q.put(i++);
        }

    }
}

消费者 1
public class Consumer1 implements Runnable {

    Q1 q;

    Consumer1(Q1 q) {
        this.q = q;
        new Thread(this, "Consumer").start();
    }

    @Override
    public void run() {
        while (true) {
            q.get();
        }

    }

}

PC1:
public class PC1 {

    public static void main(String args[]) {

        Q1 q = new Q1();
        new Producer1(q);
        new Consumer1(q);
        System.out.println("Press Control-C to stop.");

    }
}

所以,他问你一创建这个线程 new Producer1(q) ,那么根据你的说法, synchronized int get() 方法一定是被同一个线程锁定的,即在访问 new Producer1(q) 时被 synchronized int put() 锁定。我说是。

但是我检查了 eclipse,get 可以通过 new Consumer1(q) 调用。该程序运行完美。

我哪里错了?

O/P:

java - 一个对象的 2 个同步方法是否有可能同时被 2 个线程访问?-LMLPHP

最佳答案

wait() 的调用将释放等待时间的监视器。

这就是 Object.wait(): 记录的内容

关于java - 一个对象的 2 个同步方法是否有可能同时被 2 个线程访问?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35627773/

10-09 05:13