java - MultiThread_Unable 得到预期的输出
问题描述
```
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,这应该导致两个不同的值否则相同
解决方案
这是因为共享数据是NOT
同步的。
要解决此问题,请使用synchronized
接触shared data
, 的方法来制作 Accum 类Thread-Safe
。
例子:
class Accum{
private static Accum a = new Accum();
private int counter = 0;
private Accum() {
}
public static Accum getAccum() {
return a;
}
public synchronized void updateCounter(int add) {
counter +=add;
}
public synchronized int getCount() {
return counter;
}
}
推荐阅读
- swift - SwiftUI - 通过 ContextMenu 呈现模态
- r - 如何为 r 中零通货膨胀的 glmmTMB 负二项式混合模型做 r 平方
- javascript - vue 绑定复选框检查到函数的结果并将其传递给一个值
- java - java搜索“可关闭”对象,其中未调用close
- c++ - 我无法在 C++ (Microsoft Visual C++) 中将 GDI+ 位图转换为 base 64
- ios - 我想在我的 ios 应用程序中使用指令实现灰色前景
- azure - 如何使用 Azure APIM 防止大文件 POST 请求?
- android - 引起:org.codehaus.groovy.control.MultipleCompilationErrorsException:启动失败:
- javascript - 如何使用输入字段进行倒计时,倒计时必须经过多少分钟?
- jwt - 使用 JWT 向资源服务器发出请求时,负载是否可能被篡改?