java - 关于线程同步的几个问题

标签 java concurrency synchronization

class Q {
int n;
boolean sse = false;
synchronized int get(){
    while (!sse)
        try{
            wait();
        }catch(InterruptedException e){
            System.out.println("Interrupted Exception Caught");
        }
    System.out.println("Got :" + n);
    sse = false;
    notify();
    return n;
        }
synchronized void put(int n){
    while(sse)
        try{
            wait();
        }catch(InterruptedException e){
         System.out.println("Caught");
        }
    this.n = n;
    sse = true;
    System.out.println("Put :" + n);
    notify();
}

}
class Producer implements Runnable{
    Q q;
    Producer(Q q) {
        this.q = q;
        new Thread(this, "Prodcuer").start();
    }
    public void run(){
        int i = 0;
        while(true) {
        q.put(i++);
        }
    }
}
class Consumer implements Runnable{
    Q q;
    Consumer(Q q) {
        this.q = q;
        new Thread(this, "Consumer").start();
    }
    public void run(){

        while(true) {
        q.get();
        }
    }
}
public class Main {


    public static void main(String[] args) {
  Q q = new Q();
  new Producer(q);
  new Consumer(q);
  System.out.println("Press Control C to stop");
    }

}

我有 2 个问题。

Q1。现在wait()函数的定义是这样的:告诉调用线程放弃监视器并进入休眠状态,直到其他线程进入同一监视器并调用notify()。 现在,在这个程序中,两个线程(一个与消费者相关,一个与生产者相关)分别在 get 和 put 中使用相同的对象 q 。那么对象 q 是否只存在一个监视器,当任何线程使用涉及 q 的函数时都会进入该监视器?

Q2 这里Consumer要等到Producer通知它,但是Producer也要等到consumer通知它?谁先开始? 在输出中,Producer 排在第一位,但是如何呢?

最佳答案

  1. Q 只有一台显示器
  2. Producer 首先启动,因为您首先在 Main 中调用了它的构造函数。

关于java - 关于线程同步的几个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6357152/

相关文章:

c++ - 为什么图书馆要在 Windows 上实现自己的基本锁?

python - 将 PC 数据与在线数据同步

java - 防止一个操作被不同的服务器多次调用

asynchronous - CUDA 流、纹理绑定(bind)和异步 memcpy

java - 将链接/ Assets 插入 Tapestry 5 中的本地化消息中

java.net.URISyntaxException : Illegal character in path at index in Struts 2. 5 Tiles 3.0。在单独服务器上的 Tomcat 8.0 上不使用 Eclipse

Android:在 getView() 中执行异步操作的最佳实践

c++ - 在 windows 中使用互斥量进行进程间同步(win32 或 C++)

java - 执行查找时无法实例化类 : com. sun.enterprise.naming.SerialInitContextFactory

java - 比较两个字符串并根据结果显示图像