当前位置: 首页 > 知识库问答 >
问题:

关于Java中多线程以及使用同步块和等待()的初学者问题/notify()

危砚
2023-03-14

我正在学习Java中的同步机制。这是给我分析的一个示例代码。很抱歉丢失了代码,但故事很简单。我们有2个消费者和4个生产者,他们被实现为线程,他们分别在一个而循环中调用这些get和put方法。

问题是为什么我们会陷入僵局?还有,如果你能回答我一些问题。

>

  • 监视器处理与通知和等待通信的线程,监视器和监视器之间有区别吗?也就是说,当一个线程内的放置方法调用通知(),另一个线程是等待得到内部的放置方法一个有效的候选接管监控器?

    我的主要问题的答案是如此“明显和愚蠢”,以至于当一个线程在方法放置的等待()内时,没有其他线程可以进入两个方法放置并通知它,从而导致死锁发生?

    通知和通知的区别是什么?

    public synchronized void put(Object o) throws InterruptedException {
        while (count == size) {
            wait();
        }
        buf[in] = o;
        //System.out.println("PUT from " + Thread.currentThread().getName());
        ++count;
        in = (in + 1) % size;
        notifyAll(); // if this is not a notifyAll() we might notify the wrong waiter
      }
    
    public synchronized Object get() throws InterruptedException {
       while (count == 0) {
           wait();
       }
       Object o = buf[out];
       buf[out] = null;
       //System.out.println("GET from " + Thread.currentThread().getName());
       --count;
       out = (out + 1) % size;
       notifyAll(); // if this is not a notifyAll() we might notify the wrong waiter
       return (o);
    }
    
  • 共有1个答案

    嵇财
    2023-03-14

    我的主要问题的答案是如此“明显和愚蠢”,以至于当一个线程在方法放置的等待()内时,没有其他线程可以进入两个方法放置并通知它,从而导致死锁发生?

    o.wait()执行一系列步骤:

    • 它释放了对o的锁,
    • 它等待直到另一个线程调用o.notify()
    • 它等待,直到锁再次可用,
    • 它重新上锁,然后最后
    • 它返回。

    因此,当一个线程在put(o)调用中执行wait()调用时,另一个线程可以在get()put()调用中执行。

     类似资料:
    • 我想更多地了解线程睡眠解析是如何工作的,以及它与睡眠()解析之外的内容有什么联系。 我知道它是由操作系统定义的,而在Windows上通常是15ms。我最近环顾四周无法确认这一点,但我依稀记得这个15ms是由操作系统循环的,并且对所有线程都是“全局的”,这意味着15ms不是线程可以Hibernate的最短时间,而是最大Hibernate时间(1)。对吗?所有操作系统都一样吗(超过持续时间)? 我想不

    • 我有两个线程的问题,似乎没有正确同步。我基本上有一个布尔值名为“已占用”。当没有线程启动时,它被设置为false。但是当一个线程启动时,线程集被占用是真的,我有一个类,它有线程(run),它们调用下面的函数。 这是一个模拟银行的示例,它接收一个金额(初始余额),然后随机执行取款和存款。我的教授提到了一些关于从取款线程到存款线程的信号?这是怎么回事?在提取线程中,它应该运行到余额为2低,并等待存款线

    • 线程2:4 . . 线程3:7 线程3:8 线程1:9 这是我为正在执行线程的类编写的代码 我认为问题在于NumberEntry对象的创建。但我不太确定怎么修好它。如果有人能以任何方式帮助我,那就太好了:)。

    • 互斥锁 互斥锁的本质是当一个 goroutine 访问的时候,其它 goroutine 都不能访问 这样就能实现资源同步,但是在避免资源竞争的同时也降低了程序的并发性能,程序由原来的并发执行变成了串行 案例 有一个打印函数, 用于逐个打印字符串中的字符,有两个人都开启了goroutine去打印 如果没有添加互斥锁,那么两个人都有机会输出自己的内容 如果添加了互斥锁,那么会先输出某一个的,输出完毕之

    • 问题内容: Java文档说“同一对象上的同步方法的两次调用不可能交错”。我需要知道的是,synchronized是否还会阻止 同一类的 两个不同 实例中的 同步方法交织。 例如,类Worker具有称为process()的方法。我们有几个在自己的线程中运行的Worker实例。我们希望防止多个实例同时运行process()方法。会 同步 吗? 谢谢。 问题答案: 没有; 仅防止多个线程在 同一 实例中

    • 我们在后端服务中遇到了这个多线程问题: 在具有30个线程的多线程Windows服务应用程序中,SysUtils出现问题。事件缓存出现。问题是NewWaitObj函数有时返回NIL而不是Event对象。此函数用于TMonitor sync methods Wait。t监视器。Wait在事件对象为零时停止工作。这会影响许多VCL和RTL线程同步源代码,并在多线程应用程序中导致不同的端问题,例如TThr