方法内的线程安全计数器

Thread safe counter inside a method

我看到一些重试代码是这样写的,如果出现异常,它会尝试调用服务 3 次,我想了解在非 MRI 多线程服务器中,这个计数器线程安全吗?是否有必要使用 Mutex 锁定进程?

这就是它的名字

MyClass.new.my_method

class MyClass
  def my_method
    counter = 3
    begin
      call_some_service_raise_some_exception
    rescue SomeException => e
      retry if counter.positive?
    end
  end
end

假设变量 counter 的范围仅限于该方法,并且 Singleton 或任何其他奇怪的东西没有发生有趣的恶作剧,那么是的,该方法在其当前形式下应该是线程安全的.

但是,如果 counter 是一个实例变量并且您使用访问器来设置它,那么该方法不是线程安全的。如果您只使用每个 MyClass 一次,您可能永远不会遇到竞争条件,但只需要 well-meaning 重构以重用 MyClass,突然间您就会遇到竞争条件。

基本上 - 如果您的方法是 self-contained,仅使用范围内的变量,并且不引用任何外部共享数据,那么默认情况下它是线程安全的。

一旦您使用了可以被另一个线程同时访问的东西,您就会产生潜在的竞争条件,您应该开始考虑同步对共享资源的访问。