代码如下,正常应该两秒后打印出break,但是为什么程序会死循环呢,但是如果在while里面加上个sleep又可以得到预期结果了,很困惑,望各位帮忙解答package test;import java.util.ArrayList;
import java.util.List;public class ThreadTest { public void test(){
List<String> list = new ArrayList<String>();
list.add("false");
test ab = new test(list);
ab.start();
while(true){
if(list.get(0).equals("true")){
System.out.println("break!");
break;
}
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
ThreadTest a = new ThreadTest();
a.test();
}
public class test extends Thread{
List<String> list = null;
public test(List<String> list){
this.list=list;
}
@Override
public void run() {
// TODO 自动生成的方法存根
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
list.set(0, "true");
}
}}
import java.util.List;public class ThreadTest { public void test(){
List<String> list = new ArrayList<String>();
list.add("false");
test ab = new test(list);
ab.start();
while(true){
if(list.get(0).equals("true")){
System.out.println("break!");
break;
}
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
ThreadTest a = new ThreadTest();
a.test();
}
public class test extends Thread{
List<String> list = null;
public test(List<String> list){
this.list=list;
}
@Override
public void run() {
// TODO 自动生成的方法存根
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
list.set(0, "true");
}
}}
test()--list内存数据 -------> 主内存list------复制给--> test()线程list -----list值改变后----> 主内存----刷新到----> test() 的list内存。
至于您说的那个在while 处加 sleep操作 应该也是便于 cpu写入最新的住内存list到test()方法中
个人认为要把list提到 threadtest类成员 并添加volatile 使其内存对每个线程可见
回答如有不妥 请回复拍砖