【发布时间】:2015-12-23 23:53:28
【问题描述】:
public class Service
{
private List<SomeType> _list = null;
public static List<SomeType> GetSomeTypeList()
{
if (_list != null) return _list;
List<SomeType> _temp = null;
_temp = FunctionToGetSomeTypeValue();
_list = _temp;
return _list;
}
}
是服务端代码,GetSomeTypeList可以被多个请求(线程)调用,FunctionToGetSomeTypeValue的返回结果即使在不同的线程中也是一样的,是一个静态资源,但是FunctionToGetSomeTypeValue可能会失败,返回null .
我的意图是在需要时获取资源,并在每次调用时尝试获取它,除非它成功。
问题是更新_list、_list = _temp的时候,需要用lock(lockobj) {_list=_temp}加锁吗?
如果两个线程都在调用GetSomeTypeList(),并且都去调用FunctionToGetSomeTypeValue(),一个是成功的,一个是失败的,成功的一个先调用_list=_temp,失败的一个然后分配_list=null。我对这种情况很好,因为最终_list 将处于良好状态,所有调用都只返回_list。
我不明白的是,如果我不使用锁,是否有可能为 _list 对象分配不正确的值(意外值)?不为空,不正确的_temp 地址正确。
所以实际的问题是,假设有变量:static int Obj = 0;
- 一个线程正在设置
Obj = 1; - 另一个线程正在设置
Obj = 2;
如果Obj没有锁定设置,Obj的值应该是1或2,不会是别的,对吗?
如果Obj 是struct 怎么办?
引用对象(地址)的分配是原子操作吗?
简单类型object(int, struct)呢?
【问题讨论】:
-
设置引用是原子的。
-
使用
lock有问题吗?
标签: c# thread-safety static-methods