java - Java:线程不会增加我传递的类实例的实例变量的值
问题描述
我期待 main 方法中的 println 返回值 45,但它返回 0。
Main class:
public class Main {
public static void main(String[] args) {
MyCounter counter = new MyCounter();
Thread thread1 = new Thread(new MyThread(counter));
thread1.start();
System.out.println(counter.getCount()); //Prints 0 :(
}
}
MyThread class:
class MyThread implements Runnable{
MyCounter counter;
public MyThread(MyCounter counter){
this.counter = counter;
}
@Override
public void run() {
for (int i = 0; i<10; i++){
counter.inc(i);
}
}
}
MyCounter:
class MyCounter {
private int count = 0;
public void inc(int i){
count += i;
}
public void dec(){
count--;
}
public int getCount(){
return count;
}
}
解决方案
可能有两种可能的情况。
当你
System.out.println
在主线程中调用时,thread1
计数器并没有增加。thread1
已经增加了计数器,但是由于内存屏障,主线程没有注意到它。
您可以thread1.join()
在调用之前添加System.out.println
。
当一个线程终止并导致另一个线程中的 Thread.join 返回时,终止的线程执行的所有语句与成功连接之后的所有语句都具有发生前的关系。线程中代码的效果现在对执行连接的线程可见。
这可以确保:
System.out.println
将在计数器递增后执行。主线程可以获得更新后的计数器。
推荐阅读
- apache-spark - 减少 Spark 作业启动次数的最佳实践。使用联合?
- javascript - ExtJS Modern - 扩展组件时要实现的初始化函数
- rust - 如果项目名称在rust中包含连字符怎么办
- fastapi - 在其他文件更改时重新加载 fastAPI
- excel - VBA的问题在带有公式的单元格中查找函数
- flutter - 在 ListView Builder 中的 ui 中显示数据的问题
- arduino - ATMega328P ADCSRA 寄存器问题
- angular - Angular 12 延迟加载语法 - 什么是正确的?
- python - 使用下划线作为与python中的关键字名称相同的变量
- java - 如何显示底部对话框