You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

访问Ruby Array是否线程安全?多线程分访不同元素场景求证

Ruby 多线程独立访问数组不同下标的线程安全性说明

首先给出明确结论:只要满足你提到的两个前置条件,Ruby官方对该场景的线程安全性提供明确保障:

  • 数组在所有线程启动前完成初始化,运行过程中不会执行修改数组长度、触发底层存储重分配的操作(如push、pop、resize等)
  • 每个线程仅操作自己对应的独立下标,不存在多个线程读写同一个下标的情况

底层逻辑说明

Ruby的数组底层实现为连续的内存指针序列,单个下标I的元素读写本质是直接通过内存偏移访问对应地址:

  • 只要数组长度固定、底层存储块不会被重分配,不同下标对应的内存地址完全独立,访问过程不会修改数组的元数据(长度、底层存储指针等),因此不存在多个线程竞争修改共享资源的可能
  • 哪怕你对对应下标的元素执行复合读写操作(如arr[i] += 1),只要该下标仅被单个线程操作,也不会出现竞态,因为不存在并发访问同一个内存位置的情况

不同Ruby实现的兼容性

所有遵循Ruby官方语言规范的实现(包括CRuby/MRI、JRuby、TruffleRuby)都支持该约定,上述场景下不需要额外加锁也不会出现线程安全问题。

符合安全要求的示例代码

n = 5
# 线程启动前完成数组初始化,长度固定为5
count_arr = Array.new(n, 0)

threads = n.times.map do |i|
  Thread.new do
    # 仅操作下标i对应的元素,无跨线程重叠
    2000.times do
      count_arr[i] += 1
    end
  end
end

threads.each(&:join)
# 输出结果固定为5 * 2000 = 10000,不会出现竞态导致的数值偏差
puts count_arr.sum

内容的提问来源于stack exchange,提问作者Spiros

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:06:03