假设我有一个像这样运行的线程:
private boolean working = true;
@Override public void run() {
working = true;
// do something
working = false;
....
}
在我的主要话题中,我不断推出使用
的状态while(threadClassObject.isWorking()) {
System.out.println(threadClassObject.isWorking());
}
这会有用吗?我试过这个例子,它似乎工作。但有没有办法可以崩溃?例如如果线程正在进行更改工作,而mainThread尝试读取它的同时发生了什么?
答案 0 :(得分:6)
问题的答案是它可能正在运行,但上面的代码是一个有风险的代码,并且可以在任何一天打破。尝试制作working
volatile
之类的
private volatile boolean working = true;
What e.g. happens if the thread is in the process of changing working while at the exact same time the mainThread tries to read it?
分配操作是原子操作。因此,如果您有单个cpu,则两个线程在访问变量时永远不会发生冲突。如果您有多个cpu,则两个线程在访问变量时可能会发生冲突。对于这两种情况,volatile
将确保该值对其他线程可见。
注意:volatile
适合您的情况,但如果您有更复杂的数据要跨线程try looking into this分享
编辑:
添加评论也是soln的一部分。使其更清晰。
基本上在cpu级别进行优化的bcoz,值改变了我的一个线程可能对另一个线程不可见。一个很好的例子是cpu cache bcoz optimization,这些值永远不会反映在另一个线程可能正在读取的ram中。 Volatile告诉我这个变量的值可以在当前线程的范围之外更改,因此不会进行这样的优化...
答案 1 :(得分:3)
您可能还希望在主线程中使用“失控”循环执行某些操作:
当前的实现将继续旋转,不会为执行run()
的线程(或系统中的任何其他人)留下太多的CPU时间。
答案 2 :(得分:1)
您需要使用同步或AtomicBoolean才能使其成为线程安全的。您的代码中的内容似乎有效,但是当您检查布尔值时,它可能不是正确的值,因此您将看到意外的结果。
答案 3 :(得分:0)
不,没有必要像布尔一样锁定原始类型。如果'working'是一个对象,那么您需要使用 synchronized 块。