2个线程可以同时访问对象的2个同步方法吗?

Shi*_*han 4 java multithreading

我在接受采访时问了这个问题.在我告诉他之前,

一旦线程进入实例上的任何同步方法,任何其他线程都不能在同一实例上输入任何其他同步方法.

考虑一下片段:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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++);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

Consumer1

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();
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

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.");

    }
}
Run Code Online (Sandbox Code Playgroud)

所以,一旦你创建了这个线程,他就会问你new Producer1(q),然后根据你的说法,该synchronized int get()方法必须被同一个线程锁定,即new Producer1(q)访问它时synchronized int put().我说是.

但我检查了eclipse,得到了可以调用new Consumer1(q).该计划完美无缺.

我哪里错了?

O/P:

在此输入图像描述

cyb*_*bye 6

呼叫wait()将释放监视器等待的时间.

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

当前线程必须拥有此对象的监视器.线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒.然后线程等待,直到它可以重新获得监视器的所有权并继续执行.

  • @Shirgill:显然没有人在这里理解你的问题. (5认同)
  • 不,这不是答案.你还没有真正理解这个问题. (2认同)