0

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

这就是它的名称

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
4

1 回答 1

2

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

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

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

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

于 2018-02-26T22:40:35.757 回答