据我所知不是。
原子对象没有数据争用,但是它们仍然会遭受争用条件的影响:两个线程可能以不可预测的顺序启动,从而导致程序结果不确定。
共享数据将是“安全的”(受原子保护),但是顺序或时间安排仍然可能是错误的。
您可以确认吗?
答案 0 :(得分:1)
是的,您正确地认为非原子操作仍可能具有竞争条件。如果您有依赖于原子对象状态的非原子操作而不受其他线程的干扰,则需要使用另一种同步技术来保持一致性。
对原子对象的原子操作将是一致的,但并非无竞争。使用原子对象的非原子操作并非无种族限制。
答案 1 :(得分:1)
不仅仅是原子对象,任何原语都可以与并发运行的线程执行的操作一起使用:
根据定义 仅在出现种族时才有用,这是访问模式的不可预测性。如果访问以一种可预测的方式井井有条,那么您应该使用编程语言中的常规可变对象。
但是,即使顺序是先验,最终结果也可以是确定性的:考虑为静态Web服务器服务于页面的并发运行线程,其中页面和字节数作为唯一可变的数据结构。可以将统计信息保存在受互斥锁保护的数据结构中(不需要互斥锁,这只是一个简单的示例):互斥锁的锁定顺序是不可预测的,但最终结果是该数据结构包含页面总数和送达的字节数;每个线程以何种顺序将计数添加到共享数据都没有关系。