那些说加synchronized关键字也出现0的,是没仔细听老师讲吧!人家也说了这种情况,这种情况是线程的执行顺序引起的(这种情况下是符合可见性的),不是线程的交叉执行引起的!
2019-04-02
其实我们都在关注0和6 的结果,看到synchronized的时候我们的第一反应都是关注加入synchronized之后结果为6才对,但是其实这里本身并不满足同步,结果0和6应该都是对的。(如果不sleep的时候)这一章的标题也是synchronized实现可见性,换句话说应该是不出现3的结果才对。这是我的理解
2019-03-24
老师讲的是真好,给老师疯狂打call,特别是主内存 跟 工作内存的图,看完之后对synchronized的机制理解 加深了
2018-12-02
经验证 加了 synchronized 之后还是出现0。再仔细看了下代码,read()方法里的输出是在if 外面,只要是读方法先执行,ready = false;然后执行输出,reult = 0; 都是初始值。哈哈,例子没找好。
2018-11-20
个人理解:不加volatile的普通变量不具有这个效果,比如线程对工作变量修改完之后,不会百分百对主内存也修改,有可能改完自己工作变量后休眠了,一直不去对主内存中的变量进行修改。但是线程对volatile变量会绑定对主内存变量也修改的操作,也可以说对volatile变量的修改 有一个 “对自己工作区变量修改并且绑定了一个对主内存变量修改”的原子性的操作。
2018-08-30
个人一个比较浅显的理解就是:
synchronized就是互斥锁,实现底层就是总线锁,当一个线程获得该锁时,其他线程就会进入阻塞状态,从而不能进行操作。
而volatile则不同,它有点像缓存锁,但是又不像锁。volatile变量在执行写操作时,会加入store的屏障指令,我的理解是这时其他线程不能能对该共享变量做出任何操作,但是可以操作其他共享变量。这时volatile的开销就比synchronized小。
synchronized就是互斥锁,实现底层就是总线锁,当一个线程获得该锁时,其他线程就会进入阻塞状态,从而不能进行操作。
而volatile则不同,它有点像缓存锁,但是又不像锁。volatile变量在执行写操作时,会加入store的屏障指令,我的理解是这时其他线程不能能对该共享变量做出任何操作,但是可以操作其他共享变量。这时volatile的开销就比synchronized小。
2018-08-14