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