被synchronized修饰,依然出现两种结果0和6,是我代码写得有问题?

来源:3-4 synchronized实现可见性代码(下)

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();
		}

	}

}


写回答 关注

3回答

  • MartonZhang
    2015-04-05 13:05:21
    已采纳

     出现0是因为读线程先得到了执行,读线程执行完,写线程才执行,这个我里面也有讲到,你稍微注意下,在“synchronized实现可见性(下)”的第03:30之后!另外,慕课网这点估计剪切的估计太快了,有点不太容易注意到,可以在写线程和读线程之间加个休眠操作,让写线程执行完,读线程在执行,也可以使用wait和notify来控制线程执行的顺序!

    慕斯卡410... 回复龙头老大灬

    为什么使主线程阻塞,会保证执行顺序呢?

    2015-12-02 18:54:58

    共 5 条回复 >

  • 一飞_0001
    2016-09-25 07:40:11

    synchronized加入后依然出现0,6的情况是正常的,我觉得假如synchronized是为了防止出现结果登录3的情况,这里老师没有讲,我也不确定我说的是否是正确的。

  • 龙头老大灬
    2015-04-05 12:50:27

    你的内部锁不是一个了

细说Java多线程之内存可见性

用两种方式实现内存可见性,代领大家深层次学习Java中的内存

55910 学习 · 74 问题

查看课程

相似问题