我用分号"发现了奇怪的行为"; 在Python中.
>>> x=20000;y=20000
>>> x is y
True
>>> x=20000
>>> y=20000
>>> x is y
False
>>> x=20000;
>>> y=20000
>>> x is y
False
Run Code Online (Sandbox Code Playgroud)
为什么第一次测试返回"True",其他测试返回"False"?我的Python版本是3.6.5.
代码片段:
a = 0
Array.new(50){
Thread.new {
500_000.times { a += 1 }
}
}.each(&:join)
p "a: #{a}"
Run Code Online (Sandbox Code Playgroud)
结果:a = 25_000_000。
据我了解,(MRI) Ruby 使用 GIL,所以只有一个 ruby 线程可以获得 CPU,但是当发生线程切换时,会存储一些 ruby 线程的数据,以便稍后恢复线程。所以,理论上,a += 1可能不是线程安全的。
但上面的结果证明我错了。Ruby 是否具有a+=1原子性?如果为真,哪些操作可以被认为是线程安全的?