2 回答
TA贡献1788条经验 获得超4个赞
不,它不是线程安全的。如果在任何计算中存在任何共享状态,则可能存在线程问题。避免线程问题的唯一方法是确保您没有更新任何共享状态。这意味着只读对象和/或使用“纯”函数。
您已经使用了“共享”这个词——这意味着由于共享状态而不是线程安全的。除非你的意思是“分布式”而不是“共享”。
独占使用只读对象。
它们是引用类型,因此它们可以在不同的线程之间共享——因此不是线程安全的——除非它们是只读的。
下面是一个只读对象的例子:
public sealed class WorkItem : IEquatable<WorkItem>
{
private readonly int _id;
private readonly string _name;
private readonly DateTime _dateCreated;
public int Id { get { return _id; } }
public string Name { get { return _name; } }
public DateTime DateCreated { get { return _dateCreated; } }
public WorkItem(int id, string name, DateTime dateCreated)
{
_id = id;
_name = name;
_dateCreated = dateCreated;
}
public override bool Equals(object obj)
{
if (obj is WorkItem)
return Equals((WorkItem)obj);
return false;
}
public bool Equals(WorkItem obj)
{
if (obj == null) return false;
if (!EqualityComparer<int>.Default.Equals(_id, obj._id)) return false;
if (!EqualityComparer<string>.Default.Equals(_name, obj._name)) return false;
if (!EqualityComparer<DateTime>.Default.Equals(_dateCreated, obj._dateCreated)) return false;
return true;
}
public override int GetHashCode()
{
int hash = 0;
hash ^= EqualityComparer<int>.Default.GetHashCode(_id);
hash ^= EqualityComparer<string>.Default.GetHashCode(_name);
hash ^= EqualityComparer<DateTime>.Default.GetHashCode(_dateCreated);
return hash;
}
public override string ToString()
{
return String.Format("{{ Id = {0}, Name = {1}, DateCreated = {2} }}", _id, _name, _dateCreated);
}
public static bool operator ==(WorkItem left, WorkItem right)
{
if (object.ReferenceEquals(left, null))
{
return object.ReferenceEquals(right, null);
}
return left.Equals(right);
}
public static bool operator !=(WorkItem left, WorkItem right)
{
return !(left == right);
}
}
一旦创建就无法修改,因此线程安全不再是问题。
现在,如果我可以假设每一个ICalculator都是在没有状态的情况下实现的,因此是一个纯函数,那么计算就是线程安全的。但是,您的问题中没有任何内容让我知道我可以做出这个假设。因此,任何人都无法告诉您您的代码是线程安全的。
因此,考虑到只读WorkItem和纯ICalculator函数,您的其余代码看起来会非常好。
- 2 回答
- 0 关注
- 152 浏览
添加回答
举报