锁定老帖子 主题:浅谈Java中的同步的方法和原理
精华帖 (1) :: 良好帖 (4) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-20
mercyblitz 写道 yangyi 写道 mercyblitz 写道 yangyi 写道 找到答案了,这个技术叫做Piggybacking,我还不知道怎么翻译。总之就是利用既有的happens-before来优化,而不是通过同步来产生新的happens-before。
Atomic类利用的是CAS操作,这个需要硬件(指令)支持。 AQS也是CAS的吧,而且CAS对于操作的原子变量内存模型语义和synchronization是等同的,CAS如果不考虑Piggybacking并不能保证全部共享变量的可见性。这里说的是Concurrent Lock可见性的问题。 AQS利用了CAS操作,最开始它的state信息利用了内存屏蔽原语volatile。我的理解是,AQS利用偏序(Happens-Before)是没有问题的,因为在执行上这些线程并没有区别,因为只要确保只有一个线程在工作,其他线程被park掉。那么AQS不需要同步synchronized原语,照样可以工作良好。因此Happens-Before的可见性,不会影响线程的工作。相反,Non-blocking 同步的性能更加。 你的理解正确,这就是Piggybacking做的事情 |
|
返回顶楼 | |
发表时间:2010-07-20
yangyi 写道 mercyblitz 写道 yangyi 写道 mercyblitz 写道 yangyi 写道 找到答案了,这个技术叫做Piggybacking,我还不知道怎么翻译。总之就是利用既有的happens-before来优化,而不是通过同步来产生新的happens-before。
Atomic类利用的是CAS操作,这个需要硬件(指令)支持。 AQS也是CAS的吧,而且CAS对于操作的原子变量内存模型语义和synchronization是等同的,CAS如果不考虑Piggybacking并不能保证全部共享变量的可见性。这里说的是Concurrent Lock可见性的问题。 AQS利用了CAS操作,最开始它的state信息利用了内存屏蔽原语volatile。我的理解是,AQS利用偏序(Happens-Before)是没有问题的,因为在执行上这些线程并没有区别,因为只要确保只有一个线程在工作,其他线程被park掉。那么AQS不需要同步synchronized原语,照样可以工作良好。因此Happens-Before的可见性,不会影响线程的工作。相反,Non-blocking 同步的性能更加。 你的理解正确,这就是Piggybacking做的事情 如果感兴趣的话,可以看看Nonblocking lock会出现ABA问题。 http://en.wikipedia.org/wiki/ABA_problem 欢迎讨论。 |
|
返回顶楼 | |