Ruby是否有原子变量,如Java中的AtomicInteger
或AtomicBoolean
?
答案 0 :(得分:9)
Here is a gem可能会提供您所需要的内容(找到linked from here)。 The code is clean and compact enough to quickly understand(它基本上是一个Mutex,正如其他人所建议的那样),如果你想编写自己的Mutex包装器,它应该给你一个很好的起点。
来自github的轻微修改示例:
require 'atomic'
my_atomic = Atomic.new('')
# set method 1:
my_atomic.update { |v| v + 'hello' }
# set method 2:
begin
my_atomic.try_update { |v| v + 'world' }
rescue Atomic::ConcurrentUpdateError => cue
# deal with it (retry, propagate, etc)
end
# access with:
puts my_atomic.value
答案 1 :(得分:3)
应该注意的是,根据互斥体实现原子类型会破坏使用“原子”抽象的目的。
正确的原子实现会发出利用CPU的比较和交换指令的代码。
答案 2 :(得分:2)
按照建议使用Mutex:
i = 0
lock = Mutex.new
# Then whenever you want to modify it:
lock.synchronize do
i += 1
end
答案 3 :(得分:1)
我不认为Ruby有一个。但是,您可以使用Mutex来模仿其中一个。
答案 4 :(得分:1)
不是原生的,但你可以使用Mutex
类获得一些原子性。
您可以使用AtomicString
实现自己的Mutex
。