【问题标题】:Monitor (semaphore) in javajava中的监视器(信号量)
【发布时间】:2018-12-02 06:08:59
【问题描述】:

我一直在阅读 Herbert Schildt 的“The Complete Reference”一书中的 Java 实践。
在本书的线程章节中,有一个线程间通信部分。
一本边书说,在当前线程终止之前,任何线程都不会执行实例的其他同步方法,但请看下面的程序。
在输出中,它执行了两种同步方法,有人怎么能解释发生了什么?

输出:

放:0
放:1
放:2
放:3
放:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4

class Main{
    public static void main(String args[]){
        Q q=new Q();

        Producer p=new Producer(q);
        Consumer c=new Consumer(q); 
    }
}

class Q {
    int n;

    synchronized int get(){
        System.out.println("get :"+n);
        return n;
    }
    synchronized void put(int n){
        this.n=n;
        System.out.println("put :"+n);
    }
}



class Producer implements Runnable{
    Q q;
    Producer(Q q){
        this.q=q;
        new Thread(this,"Producer").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();
        }
    }
}

【问题讨论】:

  • 请添加有问题的输出
  • 等一下,我也更新了程序。
  • 输出已添加

标签: java multithreading monitor


【解决方案1】:

Java docs中提取,

在同步方法上的两次调用是不可能的 交错的相同对象。当一个线程正在执行同步 对象的方法,调用同步的所有其他线程 相同对象块的方法(暂停执行)直到第一个 线程完成了对象

因此,终止不是指线程本身(例如:Consumer 不会等到Producer 死亡或完成,反之亦然),而是任何同步方法/块的执行完成.

为了回答你的问题,ProducerConsumer 仍然可以使用 Q 运行,但 getput 方法将永远不会同时执行,因为与对象实例的隐式同步关键字synchronized

ProducerConsumer 在任何给定时间只会执行一个方法,即当getConsumer 调用时,Producer 不能调用put,反之亦然。

【讨论】:

  • 这意味着消费者只等到生产者在它的 void run() 中执行代码。但是如何。在我的输出中。 Get 4 执行了多次?
  • @DhruvPatel: 你的Consumer.run() 只是重复get()s - 没有没有保证一旦get() 返回,哪些线程会前进,至少最多下一个put()4 是预期值。 (然后,有Thread.yield()。)
  • @DhruvPatel 控制台上打印的 get 或 put 行数完全取决于底层操作系统调度程序,除非您使用 java 并发构造(锁、信号量等)来控制它们。不能保证在 M 行 put 行之后总是会打印 N 行 get 行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多