- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,我现在正在与 java 并发作斗争,我有同步问题。我在堆栈上读了很多问题,但这里什么也看不到。
Class Checker
检查X
类的值。它应该始终是偶数(2,4,6,8 ...)
类 X 包含由 Checker.class
检查的值
。 X
提供了increment
方法,该方法应将X.class
的value
加2
类Y
它只负责调用X.class
的inc()
方法
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* Checks for concurrency fails
*
* @author Jones
*
*/
class Checker implements Runnable {
public Checker() {
new Thread(this).start();
}
@Override
public void run() {
while (true) {
if (X.value % 2 != 0){
System.out.println("Concurrency fail");
System.out.println(X.value);
}
try {
TimeUnit.MILLISECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class X {
static Integer value = 0;
static synchronized void inc() {
value++;
Thread.yield(); // to accelerate probability of non concurrent
// behaviour
value++;
}
}
class Y implements Runnable {
X x;
public Y(X x) {
this.x = x;
new Thread(this).start();
}
@Override
public void run() {
while (true) {
x.inc();
try {
TimeUnit.MILLISECONDS.sleep(150);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) throws IOException {
X x = new X();
for (int i = 0; i < 5; i++) {
new Y(x);
}
new Checker();
}
}
我不明白为什么这里的并发失败。这应该是正确的。所有 Y 线程都在同一个对象上操作,这意味着它们应该使用相同的锁?为什么这里并发失败呢?我错过了什么?
最佳答案
您正在直接访问 X.value
,无需任何同步。因此,您不能对它的值(value)抱有任何期望。
引入一个同步的 getValue()
方法,并从 Checker 中调用此方法,以获得您期望的行为。
关于Java并发-synchronized方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22823672/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!