作者回复: synchronized的实现都知道了,厉害!
作者回复: 👍厉害
作者回复: sync的优化都知道了,厉害啊
作者回复: 实在是太厉害了!!!
作者回复: 理解正确!
作者回复: 是的,并发包里的原子类都是靠它实现的
作者回复: 你这么优秀,我该怎么指导呢?你这不是用lock1 保护 lock2,lock2保护value吗?很符合我们的原则。我怎么没想到呢?
作者回复: 1. println的代码里锁的this指的是你的控制台,这个锁跟你的代码没关系,而且println里也没有写操作,所以println不会导致强刷缓存。
我觉得是因为println产生了IO,IO相对CPU来说,太慢,所以这个期间大概率的会把缓存的值写入内存。也有可能这个线程被调度到了其他的CPU上,压根没有缓存,所以只能从内存取数。你调用sleep,效果应该也差不多。
2. 线程切换显然不足以保证可见性,保证的可见性只能靠hb规则。
3. 线程结束后,不一定会强刷缓存。否则Join的规则就没必要了
并发问题本来就是小概率的事件,尤其有了IO操作之后,概率就更低了。
作者回复: 为快点赞
作者回复: 比喻很生动
作者回复: 我觉得你这个才是正道,并发问题小心还躲不过呢,哪里敢冒险啊!没想到还有学生看这个专栏,有前途👍
作者回复: 你说的对,从实现上看是这样。但是hb没有这样的要求
作者回复: 👍
作者回复: get和addone锁的是一个对象,结合上一期的hb规则再想想
作者回复: 有兴趣的自己找资料看吧
作者回复: 感谢热心同学的回复!!
作者回复: 1. synchronized 能保证互斥,所以操作1完成后刷入内存也没问题。如果你同步代码块里要操作10亿个共享变量,它不放内存放哪里呢?缓存早就爆表了。
2. 同意
3. 同意,另外volatile还会遵循hb规则。Synchronized解锁后会强刷缓存。