italycappuccino
2015-04-05 01:20
public class SynchronizedDemo2 {
private boolean ready = false;
private int result = 0;
private int number = 1;
public synchronized void write() {
ready = true;
number = 2;
}
public synchronized void read() {
if (ready) {
result = number * 3;
}
System.out.println("result=" + result);
}
private class ReadWriteThread extends Thread {
private boolean flag;
public ReadWriteThread(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
if (flag) {
write();
} else {
read();
}
}
}
public static void main(String[] args) {
for (int i = 0; i < 5000; i++) {
SynchronizedDemo2 demo = new SynchronizedDemo2();
demo.new ReadWriteThread(true).start();
demo.new ReadWriteThread(false).start();
}
}
}
出现0是因为读线程先得到了执行,读线程执行完,写线程才执行,这个我里面也有讲到,你稍微注意下,在“synchronized实现可见性(下)”的第03:30之后!另外,慕课网这点估计剪切的估计太快了,有点不太容易注意到,可以在写线程和读线程之间加个休眠操作,让写线程执行完,读线程在执行,也可以使用wait和notify来控制线程执行的顺序!
synchronized加入后依然出现0,6的情况是正常的,我觉得假如synchronized是为了防止出现结果登录3的情况,这里老师没有讲,我也不确定我说的是否是正确的。
你的内部锁不是一个了
细说Java多线程之内存可见性
55898 学习 · 89 问题
相似问题