一、以下代码会如何执行
public class test {
public static void main(String [] args){
ThreadDemo td = new ThreadDemo();
new Thread(td).start();
while(true){
if(td.isFlag()){
System.out.println("Thread end");
}
}
}
}
class ThreadDemo implements Runnable {
private boolean flag = false;
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = true;
System.out.println("ThreadDemo end");
}
public boolean isFlag(){
return this.flag;
}
}
结果为主线程死循环下去,因为子线程修改的字段未刷新到主存中,导致主线程对flag一直不可见,增加volatile后可即时获取到子线程的修改。
二、加入volatile修饰的是对象,对象内的值发生变化后是否可立即可见。
答案为否,只能保证当前对象的引用是否可见,对象字段不能保证。
Java并发:volatile与线程间通信
本文探讨了Java中volatile关键字的作用及其在多线程环境下的应用。通过一个具体的代码示例,展示了volatile如何解决线程间的可见性问题,并解释了其限制,即无法确保对象内部状态的即时可见。

被折叠的 条评论
为什么被折叠?



