最赞回答 / RobinYGH
olatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.volatile仅能使用在变量级别,synchronized则可以使用在变量,方法.volatile仅能实现变量的修改可见性,但不具备原子特性,而synchronized则可以保证变量的修改可见性和原子性.volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞.volatile标记的变量不会被编译器优化,而s...
2017-02-21
最赞回答 / 洋__
呵呵,提问者没搞懂,大家不要被这个人带偏了,他才在误人子弟!估计提问者是想说内存可见了,怎么还会执行结果不一致呢?谁说过保证了内存可见性就保证执行结果是一致的??别人是内部线程类,视频里read()操作和write()操作加了synchronized是原子性的,但是又不保证read()和write()哪个先执行,所以会出现2个结果,如果是先read()执行,那么result就是0,如果write()先执行,那么result就是6。最后老师通过延时保证write()先执行,结果就是只有6。建议多学习,少抱怨...
2016-11-01
最新回答 / 慕斯0128424
这么跟你解释:一行java代码被cpu执行的时候执行的是若干条cpu指令,synchronized对应到cpu执行若干条指令,但是volatile也对应若干条指令,相同的是他们对应的指令有一些相同的,即有重叠,但是又有差异,于是功能有相同也有差异。他们的使用场景也是如此。你现在不适合去理解深沉原理,先学会用,用对场景。
2016-07-28
最新回答 / 慕斯0128424
synchronized是java语言特性,join()方法你可以理解为仅仅是Thread类作者提供的一个觉得可能较为通用的工具方法。在B对象的方法中执行ThreadA.join()方法,其结果是在B对象方法调用处,通过死循环检测ThreadA是否死亡(isAlive()方法),如果死亡(理解为ThreadA的run()方法运行结束)则继续B对象的方法后续代码执行。建议阅读join()方法源码
2016-02-22
最新回答 / 天启之魂
一个线程sleep 后 实际也就释放了执行权 这样可以让其他线程去执行,这样不就达到多个线程交替执行吗?结果就明显了不然 执行的结果是完全随机的,说不好一个线程执行很久都是有可能的
2015-12-16
最新回答 / qq_可口可乐_4
线程是抢占式执行的,sleep意味着当前线程在一段时间内不执行操作,可是该线程的工作内存中已经得到了number,没有改变number的值意味着主内存中的值也没有改变,在sleep这段时间内其他线程又得到主内存中的number,这个number与sleep中的number可能一样(要是没有其它线程),这样的话这2个线程在最终执行完之后等于number++只执行一次
2015-12-02