- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为“Little book of Semaphores”中的“Exclusive Queue”问题编写一个解决方案。问题表述如下:
想象一下,线程代表舞厅舞者,两种舞者(领导者和追随者)在进入舞池之前排成两个队列等待。当领导者到达时,它会检查是否有追随者在等待。如果是这样,他们都可以继续。否则它会等待。类似地,当跟随者到达时,它会检查领导者并相应地继续或等待。此外,每个领导者只能与一个追随者同时调用舞蹈,反之亦然。
书中提到它是使用信号量的解决方案,但我试图使用 Java 中的对象锁来解决它。这是我的解决方案:
ExclusiveQueuePrimitive.java:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ExclusiveQueuePrimitive {
public static void main(String[] args) throws InterruptedException {
System.out
.println("-------------------------------Application START-------------------");
final int NUM_RUN = 1000;
// for (int j=0; j<NUM_RUN; j++) {
for (;;) {
Counters c = new Counters();
int NUM_THREADS = 5;
List<Thread> threads = new ArrayList<Thread>();
for (int i = 0; i < NUM_THREADS; i++) {
Thread tl = new Thread(new Leader(c, i + 1));
Thread tf = new Thread(new Follower(c, i + 1));
threads.add(tf);
threads.add(tl);
tf.start();
tl.start();
}
for (int i = 0; i < threads.size(); i++) {
Thread t = threads.get(i);
t.join();
}
}
// System.out.println("--------------------------------Application END-------------------");
}
}
class Counters {
public int leaders = 0;
public int followers = 0;
//public final Lock countMutex = new ReentrantLock();
public boolean printed = false;
public Lock printLock = new ReentrantLock();
public final Lock leaderQueue = new ReentrantLock();
public final Lock followerQueue = new ReentrantLock();
public void dance(String str) {
System.out.println("" + str);
}
public void printLine() {
System.out.println("");
}
}
class Leader implements Runnable {
final Counters c;
final int num;
public Leader(Counters counters, int num) {
this.c = counters;
this.num = num;
}
@Override
public void run() {
synchronized (c.leaderQueue) {
try {
if (c.followers > 0) {
c.followers--;
synchronized (c.followerQueue) {
c.followerQueue.notify();
}
} else {
c.leaders++;
c.leaderQueue.wait();
}
c.dance("Leader " + num + " called dance");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Follower implements Runnable {
final Counters c;
final int num;
public Follower(Counters counters, int num) {
this.c = counters;
this.num = num;
}
@Override
public void run() {
synchronized (c.followerQueue) {
try {
if (c.leaders > 0) {
synchronized (c.leaderQueue) {
c.leaders--;
c.leaderQueue.notify();
}
} else {
c.followers++;
c.followerQueue.wait();
}
c.dance("Follower " + num + " called dance");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
但是跑了一会儿就挂了。你能告诉我僵局在哪里以及我如何解决它吗?另外,我想在 Leader 和 Follower 完成后打印一个新行。我该怎么做?
最佳答案
这是一个典型的死锁:
class Leader {
synchronized (c.leaderQueue) { ...
synchronized (c.followerQueue) { ... }
}
}
class Follower {
synchronized (c.followerQueue) { ...
synchronized (c.leaderQueue) { ... }
}
}
防止这种情况最简单的方法是以相同的顺序获取锁(顺便说一句,同时使用Lock
和synchronized
不是一个好习惯)。还有其他检测死锁的技术,但在您的任务上下文中,更改算法应该更有益。
从简单开始 - 使用单锁使逻辑正确,然后在不破坏正确性的情况下做更多聪明的事情来提高并发性。
关于Java 并发 : Exclusive Queue Problem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5906998/
我正在尝试实现一种“独占消费者”或“独占队列”,以避免最终用户必须固定任何内容:代理将选择一个消息消费者来获取队列的所有消息,以确保排序,如果该消费者失败,代理将自动故障转移并选择另一个消费者。 我想
我想从多行文本字段中排除特定模式。我有一个捕获该模式的正则表达式,所以现在我想创建一个匹配除该模式之外的所有内容的表达式。对此的一般方法是什么?出于某种原因,像这样的负面前瞻:^(.(?!expres
这是我的view.jsp。当我单击 view.jsp 上的超链接时,我想在弹出窗口中显示 jpop.jsp 页面?谁能告诉我这可能吗?我是 liferay 的新手。我在 LiferayWindowSt
我想从多行文本字段中排除特定模式。我有一个捕获该模式的正则表达式,所以现在我想创建一个匹配除该模式之外的所有内容的表达式。对此的一般方法是什么?出于某种原因,像这样的负面前瞻:^(.(?!expres
我正在使用一组 jQuery 选择器在多个不同的页面上插入一些内容;然而,有些页面具有多个选择器,因此内容会在页面上插入多次。例如: $('div.rColInnerL:first, div.box3
我们正在维护一个使用 DirectDraw 的全屏 256 色图形模式的旧视频游戏。问题是,某些在后台运行的应用程序有时会在游戏运行时尝试更改系统调色板,从而导致图形损坏。 我们可以(有时)通过处理
我有一个现有的应用程序,它在数据库中有以下实体 客户 发票组 销售组 一个客户可以属于多个组。目前这是按以下方式映射的 Customer table - cid (Pk) - fname - s
我想知道您是否可以以一种只有特定的其他方法 B 才能调用 A 的方式声明方法 A。 蜂鸣的原因是我想限制一种方法从 main 调用蜂鸣(因为在大学里有奇怪的测试算法)。如果 main 调用了这个方法(
我目前正在使用 Ruby 编写 Ruby 解析器,更准确地说是使用 Parslet,因为我认为它比 Treetop 或 Citrus 更容易使用。我使用官方规范创建我的规则,但有些语句我无法编写,因为
SQL Fiddle 在这里:http://sqlfiddle.com/#!2/a2e41/8 我有一个查询执行多项检查:列 uidto 或 uidfrom 是否包含给定值。这工作正常,但只要我想排除
我正试图找到用 C 语言编写 XNOR 门的最有效方法。 if(VAL1 XNOR VAL2) { BLOCK; } 有什么建议吗? 谢谢。 最佳答案 有两个操作数,这很简单: if (val
来自 API 的信息非常稀少 - 还考虑到 Thread.critical 似乎没有记录。 Wraps a block in Thread.critical, restoring the origin
题目地址:https://leetcode.com/problems/exclusive-time-of-functions/description/ 题目描述 Given the running
例如:按 userid, sdate, edate 索引 userid sdate edate 001 2019-01-01 2019-01-30 如果我像这样插入新数据: u
我们使用的是 sonarqube 5.1.1,通常“应用项目排除”步骤非常非常慢。有时在 1-2.5 小时的范围内。 我们有“全局源文件排除”来排除 2 种模式:**/swagger-ui/****/
我在 symfony 项目上工作,我想从 中排除一些生成的代码 Sonar 分析 . 我想排除一个以此路径命名的文件夹: src/应用程序/奏鸣曲 . 我尝试了许多 Sonar 排除的可能性,但徒劳无
这个问题已经有答案了: Combine whitelist and blacklist in java regex expression (3 个回答) 已关闭 7 年前。 我想匹配 a 和 z 之间
我知道排除单词的正则表达式,无论如何,它应该是 (!?wordToIgnore|wordToIgnore2|wordToIgnore3) 但我有一个现有的、复杂的正则表达式,我需要将其添加,但我对如何
我正在尝试为“Little book of Semaphores”中的“Exclusive Queue”问题编写一个解决方案。问题表述如下: 想象一下,线程代表舞厅舞者,两种舞者(领导者和追随者)在进
我正在我们的软件中配置 Maven,它运行得非常好。我有一些细节需要修复,但它们没有按照我想要的方式工作,我需要知道我能做什么。具体来说,我们都使用 Eclipse,并且在之前的配置(没有 Maven
我是一名优秀的程序员,十分优秀!