让我们使用像LinkedBlockingDeque这样的线程安全类
BlockingQueue<Task> taskQueue = new LinkedBlockingDeque<Task>();
我知道像take和put这样的操作是线程安全的,所以它们尊重在发生之前发生的关系。
但是,如果我想组成一些操作来使它们具有原子性呢?如下所示:
if(taskQueue.size() == 1) {
/*Do a lot of things here, but I do not want other threads
to change the size of
如果我使用来自System.Collection.Concurrent命名空间(如ConcurrentDictionary<K, V> )的集合,并且希望保持另一个线程对该对象的访问和修改与我的访问和修改交织在一起。
我该怎么做呢?如果可能的话,当这些操作发生时,当争用线程试图访问ConcurrentDictionary时,它会不会变得非常慢呢?
ConcurrentDictionary<KType, VType> conDict = ...;
// How do I ensure that these operation are performed atomical
今天我在我们的代码库中发现了以下方法,它让我意识到它可能不是线程安全的。我认为IEnumerable可能是一个引用类型,并且可能在代码执行时被另一个线程修改。这是正确的吗,或者这个方法到底是线程安全的吗?如果不是,这个方法是静态的吗?似乎使它成为一个实例方法不会改变entities参数在另一个线程中被修改的可能性。
/// <summary>
/// Writes the Entity data in <paramref name="entities"/> to a CSV file located at <paramref name="p