java - 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()
解决方案
如果 1 个线程(t1)将员工 id 的值更改为 1,另一个线程(t2)将员工 id 的值更改为 2,那么会出现什么问题?
这种情况称为数据竞争。如果两个线程各自将相同的变量设置为一个值或另一个值,那么最终结果将是该变量保存一个值或另一个值。两个线程实际上不可能同时存储到同一个位置:内存系统将序列化存储。所以,结果取决于哪一个先走,哪一个第二走。
没有实用的方法可以预测哪个先行,哪个先行,这意味着没有实用的方法可以预测结果。在大多数程序中,这被认为是一件坏事。
以及如何解决?
这取决于你。真的!哪个线程应该赢得比赛没有正确答案。通常,我们通过设计程序来“解决”问题,使它们的行为不依赖于数据竞争。
在您的示例中,您有两个线程试图做两个不兼容的事情。他们都想分配相同的变量,但他们不同意它的值应该是什么。这是不良设计的标志。这可能意味着您还没有真正考虑过该变量在程序中代表什么,或者您还没有真正考虑过为什么或何时应该更改它。
PS,如果一个Employee
对象的一个字段包含一个员工的ID,那么它几乎肯定应该是一个final
字段。
推荐阅读
- eigen - 在 Eigen 中乘以诊断矩阵(作为向量提供)
- javascript - 在服务器或浏览器上将 JSX 转换为 JS?
- java - 使用流从 Map 对象列表中仅获取键
- eclipse - 为什么 Eclipse 在运行我的 JavaFX 应用程序时会显示这些错误?
- android - Dagger2 和 ViewModels 用于 Activity 和 Fragment
- android - 如何在 ListView 上显示带有图像 URL 的 firebase 存储图像?
- python - 在 4 个列表的组中查找项目的索引
- javascript - 在 usestate 钩子的帮助下使用 reactjs 获取 textarea 字符数
- typescript - TypeScript:将函数返回类型表示为两个联合之间的关系
- svn - Subversion - 当使用 SVN Basic Auth 时,如何限制其他用户在单个存储库中创建的项目的可见性?