我有一个名为“H2O问题”的家庭作业,我应该实现一个名为H2OBarrier的类,它有3种方法。
我应该使用Java可重入锁和条件来执行此操作。
这是我目前为止的代码,我想知道我是否正确地使用了lock和unlock。
public class H2OBarrier {
int hCount;
int oCount;
Lock lock = new ReentrantLock();
Condition hWait = lock.newCondition();
Condition oWait = lock.newCondition();
public void HReady() {
lock.lock();
hCount++;
try {
hWait.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void OReady(){
lock.lock();
oCount++;
try {
while(hCount<2 && oCount<1){
oWait.await();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
makeWater();
}
}
public void makeWater(){
hCount--;
hWait.signal();
lock.unlock();
hCount--;
hWait.signal();
lock.unlock();
oCount--;
oWait.signal();
lock.unlock();
}
}
我应该在我的 makeWater 方法以外的任何地方调用解锁 ()吗?整个程序的流程对我来说似乎非常合乎逻辑,我只是想确保我正在做的事情总体上看起来是正确的。
您的代码正在产生死锁。想象一下,5个原子首先通过,5个原子进入由wacel()产生的o队列。现在,如果2个h原子通过并不重要,由于您的代码,所有h原子都将自动等待。
为什么java可重入锁不会导致死锁?
主要内容:1 什么是Java可重入锁,2 Java可重入锁的优势,3 Java可重入锁的例子1 什么是Java可重入锁 根据Sun公司的说法,Java锁是可重入的,这意味着,如果从方法中调用方法,则Java线程可以将同一把锁用于不同的同步方法。 2 Java可重入锁的优势 它避免了单线程死锁。 3 Java可重入锁的例子 让我们通过以下示例了解Java可重入锁: 在此类中,m和n是同步方法。m() 方法在内部调用n() 方法。 现在让我们在线程上调用m() 方法。在下面给出的类中,我们使
我在学习Java中的重入锁定。需要一定的澄清这个概念,它实际上是如何工作的。下面的片段我所理解的是:
主要内容:1 ReentrantLock的概述,1.1 ReentrantLock的API方法,1.2 可重入,1.3 公平与非公平,2 ReentrantLock的原理,2.1 基本结构,2.2 构造器,2.3 非公平模式加锁原理,2.4 公平模式加锁原理,2.5 解锁原理,3 ReentrantLock总结Java的ReentrantLock的源码实现,包括加锁、解锁的源码,以及公平性、重入性的实现! 1 ReentrantLock的概述 public class ReentrantLock
问题内容: 我在这里思考:如果您有2个线程执行需要同步的FAST操作,那么非阻塞方法不是比阻塞/上下文切换方法更快/更好的方法吗? 非阻塞的意思是: while(true){如果(checkAndGetTheLock())中断;} 如果您有太多线程在锁中循环,我唯一想到的就是饥饿(CPU耗尽)。 如何平衡一种方法与另一种方法? 问题答案: 以下是 Java Concurrency in Pract
我正在编写一个应用程序来管理或自定义Android设备的解锁屏幕。它的工作原理如下: 用户使用电源按钮锁定屏幕。 用户尝试解锁屏幕,从而再次按下电源按钮 我的活动弹出--屏幕仍然锁定 用户回答问题,如果答案正确,屏幕解锁 我已经为第三步创建了一个活动,并将以下代码添加到其方法中: 这工作正常,完全符合我的期望。我的问题是第四步。我已经搜索并找到了许多解决方案,但没有一个适合我。 如何以编程方式锁定