通过引用将值类型变量传递给静态方法线程安全吗?
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线程安全吗?