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的情况,这里老师没有讲,我也不确定我说的是否是正确的。
你的内部锁不是一个了