通过引用将值类型变量传递给静态方法线程安全吗?

Posted

技术标签:

【中文标题】通过引用将值类型变量传递给静态方法线程安全吗?【英文标题】:Will passing a value type variable by reference into a static method thread safe? 【发布时间】:2012-11-27 00:19:10 【问题描述】:

代码如下所示:

public class JobManager

    public static void TrackExceptionCount(ref int exceptionCount)
    
        Interlocked.Increment(ref exceptionCount);
    

    //other helper methods

我会在其他地方调用这个方法,比如:

private static int _exceptionCount;

JobManager.TrackExceptionCount(ref _exceptionCount);

我认为 Interlocked.Increment 会处理线程安全问题,对吧?

编辑:

我有多个这样的 Job 类:

class JobA

    private static int _exceptionCount;

    public void method1()
    
       Task.Factory.Start(()=>
         try
         
             //Some code
         
         catch(exception ex)
         
            JobManager.TrackExceptionCount(ref _exceptionCount);
         
       );
    

    public void method2()
    
       Task.Factory.Start(()=>
         try
         
             //Some code
         
         catch(exception ex)
         
            JobManager.TrackExceptionCount(ref _exceptionCount);
         
       );
    


class JobB

    private static int _exceptionCount;

    public void method1()
    
       Task.Factory.Start(()=>
         try
         
             //Some code
         
         catch(exception ex)
         
            JobManager.TrackExceptionCount(ref _exceptionCount);
         
       );
    

    public void method2()
    
       Task.Factory.Start(()=>
         try
         
             //Some code
         
         catch(exception ex)
         
            JobManager.TrackExceptionCount(ref _exceptionCount);
         
       );
    

我相信在 catch 块中直接调用 Interlocked.Increment 可能是更好的方法。

但仍想知道 JobManager.TrackExceptionCount(ref _exceptionCount) 是否可能正常工作

谢谢。

【问题讨论】:

不,static 关键字会毁了你的一天。 Interlocked 可能会起作用,但当然,您的代码 sn-p 完全不足以查看它在其他地方的使用情况。 你有任何证据表明这样做不是线程安全的吗?你有任何错误吗?还是您只是想确认或否认您的怀疑? 你好Enigmativity,我刚遇到一个类似的案例,所以想确认或否认这个怀疑。 嗨@JeffChen - 您需要使用@ 表示法来确保发送通知。我再次检查了这个问题只是运气。 【参考方案1】:

假设您对Interlocked.Increment 的调用是存储位置_exceptionCount 的唯一用途,这是安全的。您可以安全地传递ref 参数。它们的工作方式有点像指向变量的托管指针(在内部,它们是)。

【讨论】:

感谢 usr,_exceptionCount 仅用于传递到互锁

以上是关于通过引用将值类型变量传递给静态方法线程安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

java 局部静态变量在多线程环境下是不是有线程安全问题??

是System.DirectoryServices.AccountManagement.GroupPrincipal线程安全吗?

java线程安全问题之静态变量实例变量局部变量

java基础---多线程---细碎总结

Servlet总结

C语言fft库函数是线程安全吗