首页 > 解决方案 > 2个线程要执行同一个对象,会出现什么问题?

问题描述

例如有1个员工类包含员工id和员工姓名,我为这个员工类创建了对象,那么这里有2个线程,这2个线程想要执行同一个员工对象,那么会出现什么问题?

如果1个线程(t1)把员工id的值改成1,另一个线程(t2)把员工id的值改成2,那么会出现什么问题呢?以及如何解决?

我在网上查了一下,我把它当作比赛条件,但并不完全理解。

这里线程名称是 t1,t2 和员工类是

public class Employee{

 private int employeeid;

 private string empname;
}

employee object creation:
Employee employee = new Employee()

标签: javamultithreading

解决方案


如果 1 个线程(t1)将员工 id 的值更改为 1,另一个线程(t2)将员工 id 的值更改为 2,那么会出现什么问题?

这种情况称为数据竞争。如果两个线程各自将相同的变量设置为一个值或另一个值,那么最终结果将是该变量保存一个值或另一个值。两个线程实际上不可能同时存储到同一个位置:内存系统将序列化存储。所以,结果取决于哪一个先走,哪一个第二走。

没有实用的方法可以预测哪个先行,哪个先行,这意味着没有实用的方法可以预测结果。在大多数程序中,这被认为是一件坏事。

以及如何解决?

这取决于你。真的!哪个线程应该赢得比赛没有正确答案。通常,我们通过设计程序来“解决”问题,使它们的行为不依赖于数据竞争。

在您的示例中,您有两个线程试图做两个不兼容的事情。他们都想分配相同的变量,但他们不同意它的值应该是什么。这是不良设计的标志。这可能意味着您还没有真正考虑过该变量在程序中代表什么,或者您还没有真正考虑过为什么或何时应该更改它。


PS,如果一个Employee对象的一个​​字段包含一个员工的ID,那么它几乎肯定应该是一个final字段。


推荐阅读