为了账号安全,请及时绑定邮箱和手机立即绑定

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

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 回答

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

2 回复 有任何疑惑可以回复我~
#1

龙头老大灬

我认为不是这样,如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法,它的问题主要是由于内部锁发生了变化,把代码改成这样应该就没问题了吧。 SynchronizedDemo2 demo = new SynchronizedDemo2(); for (int i = 0; i < 5000; i++) { demo.new ReadWriteThread(true).start(); demo.new ReadWriteThread(false).start(); }
2015-04-05 回复 有任何疑惑可以回复我~
#2

龙头老大灬

不好意思,代码看错了,你说的们问题,确实是线程执行的顺序时间问题
2015-04-05 回复 有任何疑惑可以回复我~
#3

italycappuccino 提问者

thanks~非常感谢!
2015-04-07 回复 有任何疑惑可以回复我~
#4

慕斯卡4106679

这里为什么加了wait和notify会执行写线程先,再执行读线程,阻塞状态怎么会影响顺序呢?
2015-12-02 回复 有任何疑惑可以回复我~
#5

慕斯卡4106679 回复 龙头老大灬

为什么使主线程阻塞,会保证执行顺序呢?
2015-12-02 回复 有任何疑惑可以回复我~
查看2条回复

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

1 回复 有任何疑惑可以回复我~

你的内部锁不是一个了

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信