我想做"计算"以下示例中的线程安全。
在此,"过程"在同一个班级控制的线程中不断运行但是"重置"是由另一个线程通过类的对象调用。
namespace sample
{
class xyz
{
int count;
reset()
{
count=0;
}
process()
{
..
..
..
count +=10
..
..
}
}
}
编辑1:这是一个可能的解决方案吗?
public class Xyz
{
private int count;
private static Object loackable = new Object();
public void Reset()
{
lock(lockable)
{
count = 0;
}
}
public void Process()
{
lock(loackable)
{
count += 10;
}
}
}
答案 0 :(得分:0)
对于基本计数器,您可以使用方法。 Interlocked
上课。
对于任何更复杂的事情,使用相同的对象来锁定计数器上的每个操作,使用相同的对象来锁定单个计数器(只要它们在问题或实例对象中显示,只要它们与同一个计数器配对,则为一个静态)一直以来。
请注意
lock
无法帮助您在一般情况下实现计数器,因为volatile
不是原子操作,并且多个线程可以读取相同的值而不是递增它,因此对于两个线程递增计数器10,您可以计数器根据时间增加10或20。它可能适用于单个写入线程,给人的印象是代码是正确的。答案 1 :(得分:-1)
您应该为'count'字段添加'volatile'关键字。这可确保'count'字段始终是线程安全的。 (Read this)
public class Xyz
{
private volatile int count;
public void Reset()
{
count = 0;
}
public void Process()
{
count += 10;
}
}
请关注C# goodline!