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

时间:2012-11-27 00:19:10

标签: .net thread-safety interlocked

代码如下所示:

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)是否可能正常工作

感谢。

1 个答案:

答案 0 :(得分:0)

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