多线程-无锁队列如何能保证线程安全?它的实现机制是什么?
经常看到关于无锁队列的在多线程中应用,这种队列既然无锁,那么如何能保证线程的同步安全问题呢?它的实现机制是什么?对它的应用有什么特定的要求吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
经常看到关于无锁队列的在多线程中应用,这种队列既然无锁,那么如何能保证线程的同步安全问题呢?它的实现机制是什么?对它的应用有什么特定的要求吗?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
无锁的前题就是读与写不在同一个元素上,如果说同一个元素那还是有锁的。只要谈到并发离不开锁。
无锁队列本质上还是有锁,只不过锁的粒度很小,通常是一个标志。
一般通过CAS(compare&set)和TAS(test&set)等原子操作结合忙等待实现的。
既然是忙等待那么适用于共享资源不会被长时间占据的情况。
java.util.concurrent 这个包下有些应用于并发处理的collection类。
无锁指的是没有用java的对象锁吧,java的并发集合类的实现原理基于将赋值操作放到更小粒度的操作中,由jvm提供一个原子操作(CAS, compare and swap,compare操作是原子的)实现,简单说就是赋值后检查是否赋值成功(变量在此期间有没有被并发修改),赋值成功则返回,否则继续尝试赋值直到成功。
java并发编程实践 这书里有详细介绍。
关于 CAS:http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzahw%2Frzahwrzahwcascasco.htm
我知道的就是设置一个标志,当这个标志为true时可以访问这个资源,false时不可访问,每次访问之前判断下
在网上google到了一篇文章,讲的是在java下的实现,可以参考下。
无锁实现线程安全的并发机制