不废话,先说原因
因为println是线程安全的
源代码如下:
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
这里synchronized不仅保证了互斥,还保证了可见性
代码:
import java.util.concurrent.TimeUnit;
class MyDate {
volatile int date = 10;
public void toDate(){
this.date = 200;
}
}
class Main {
public static void main(String[] args) {
MyDate myDate = new MyDate();
//线程AAA
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "come in");
myDate.toDate();//AAA线程修改数据为 60
try{
TimeUnit.SECONDS.sleep(3);//休眠 3秒
}catch (Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "enging");
}, "AAA" ).start();
while(myDate.date == 10){
System.out.println("waiting......");
try{
TimeUnit.SECONDS.sleep(3);//休眠 3秒
}catch (Exception e){
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "主线程ok" + myDate.date);
}
}