【发布时间】:2020-09-20 00:24:14
【问题描述】:
```
package programs;
public class TestThreads {
public static void main(String[] args) {
ThreadOne t1 = new ThreadOne();
ThreadTwo t2 = new ThreadTwo();
Thread one = new Thread(t1);
Thread two = new Thread(t2);
one.start();
two.start();
}
}
class Accum{
private static Accum a = new Accum();
private int counter = 0;
private Accum() {
}
public static Accum getAccum() {
return a;
}
public void updateCounter(int add) {
counter +=add;
}
public int getCount() {
return counter;
}
}
class ThreadOne implements Runnable{
Accum a = Accum.getAccum();
@Override
public void run() {
for(int x=0;x<98;x++) {
a.updateCounter(1000);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("one "+ a.getCount());
}
}
class ThreadTwo implements Runnable{
Accum a = Accum.getAccum();
@Override
public void run() {
for(int x=0;x<99;x++) {
a.updateCounter(1);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("two "+ a.getCount());
}
}
```
预期的输出应该如下
一个98098 两个98099
但我得到的一号和二号的值相同。
这是预期的还是两者都会导致不同的值?
当涉及到线程优先级时,即使 jvm 调度程序负责选择首先执行哪个线程,该程序的结果如何,其中两个 void 运行 for 循环的程序,分别为 98 和 99,这应该导致两个不同的值其他都一样
【问题讨论】:
-
运行多次,直到得到正确的结果。或者在不同的机器、硬件或架构上运行它。当存在比赛条件时,所有赌注都将取消。当您真正想要其他结果时,您可能会得到想要的结果。
标签: java multithreading thread-safety output counter