Parallel.ForEach-具有嵌套实例对象的线程安全性

本文关键字:对象 线程 安全性 实例 嵌套 ForEach- Parallel | 更新日期: 2023-09-27 18:27:25

在这种情况下,员工和/或疾病实例是线程安全的吗?每个线程都有自己的对象副本吗?起初我以为每个线程都有自己的副本,但现在我不确定。

Parallel.ForEach(line01s, _options, o =>
{
    var employee = new Employee();
    // set values on employee...Safe?
    var illness = new Illness();
    // set values on illness...Safe?
    employee.AddIllness(illness);  // Illness is a property on Employee
}

Disease对象是否可能设置在错误的Employee对象上?我需要在员工周围添加锁吗?AddDisease(疾病)?我越是使用这种TPL的东西,就越发现我不理解

Parallel.ForEach-具有嵌套实例对象的线程安全性

您的示例仅适用于在lambda表达式范围内创建的对象,因此您无需担心。如果您正在修改lambda块之外的对象的状态,那么您需要担心锁定等问题。

如果在employees集合上迭代Parallel.ForEach,或者在lambda中创建新的employee,那么就不用担心了。每个lambda调用都完全独立于其他调用(如果闭包中没有外部变量)。

如果员工集合有重复项或处理更复杂,则必须使用一些同步代码。