论坛首页 Java企业应用论坛

浅谈Java中的同步的方法和原理

浏览 8270 次
精华帖 (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做的事情
0 请登录后投票
   发表时间: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

欢迎讨论。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics