Java 线程工作不正常(同步)

Java 线程工作不正常(同步),java,java-threads,Java,Java Threads,当我运行这段代码时,输出是“添加了一些东西”,然后是无限循环 我的程序应该打印: 添加了一些内容 有些东西印出来了 我不明白为什么程序不能在循环时退出 import java.util.LinkedList; public class Test { static LinkedList<String> list = new LinkedList<String>(); public static void main(String[] args) { new Threa

当我运行这段代码时,输出是“添加了一些东西”,然后是无限循环

我的程序应该打印:

添加了一些内容

有些东西印出来了

我不明白为什么程序不能在循环时退出

import java.util.LinkedList;
public class Test {
static LinkedList<String> list = new LinkedList<String>();
public static void main(String[] args) {
    new Thread(new Runnable() {

        @Override
        public void run() {
            while(list.isEmpty()); // here is the loop
            System.out.println("something is printed"+list.get(0));
        }
    }).start(); 
    new Thread(new Runnable() {

        @Override
        public void run() {
            try{
                Thread.sleep(200);
                list.add("something");
                System.out.println("something is added");
            }catch (Exception e) {}
        }
    }).start(); 
  }
}
import java.util.LinkedList;
公开课考试{
静态LinkedList=新建LinkedList();
公共静态void main(字符串[]args){
新线程(newrunnable()){
@凌驾
公开募捐{
while(list.isEmpty());//这是循环
System.out.println(“打印的东西”+list.get(0));
}
}).start();
新线程(newrunnable()){
@凌驾
公开募捐{
试一试{
睡眠(200);
添加(“某物”);
System.out.println(“添加了某些内容”);
}捕获(例外e){}
}
}).start();
}
}
我正在寻找解决方案和解释


非常感谢

为了让线程安全地通信和共享数据,它们必须正确地同步。在您的示例中,最简单的方法是将列表包装在同步包装器中:

static List<String> list = Collections.synchronizedList(new LinkedList<>());
static List=Collections.synchronizedList(new LinkedList());

您在标题中暗示了答案:没有同步。我不明白。解决方案是什么?虽然我知道你的程序有什么问题,或者如何改进,但你没有弄清楚它到底发生了什么,问题是什么。如果你能说出你看到的是什么输出,以及多次运行时是否相同,那就太好了。@M.leRutte它在问题的第一行……这并不能解释为什么代码没有退出,因为如果你读了这些语句,它应该退出。添加syncrhonization不是原因,添加了一个简单的
System.out.println(list.isEmpty())
也会使代码正确退出,@M.leRutte它不会退出,因为内存可见性是一个同步问题。
println()
语句意外地修复了这个问题,因为它包含一个
synchronized
块,用于刷新内存。这太奇怪了!发生了什么事!:)如果我添加,而(list.isEmpty())System.out.print(“”);它起作用了。顺便说一下,你应该考虑使用<代码> java。UTI.O.CONTRONG。BuffgQueGuangs,循环运行直到列表中的某个东西才有助于对CPU进行MAX化。