您好我正在尝试使用Double Object,而不是类型以便同步线程。这是家庭作业。
概述:此应用程序是银行系统的一个简单示例,它具有作为存储者和作为提取者运行的线程运行的线程。存款人增加10美元,提款人删除10美元,因此应用程序的结尾应该有10个不变的银行账户。
在每个班级(存款人和提款人)中,我能够在帐户对象上使用块同步来完成目标。所以我的作业的作业部分已经完成,我不需要帮助。
我开始思考,我觉得锁定整个Account对象是过度的。由于交易中唯一真正的关键部分是改变变量
balance
最初可变余额是双倍的。我的目标是将变量更改为Double对象,然后将同步块移动到帐户对象内部,并且只围绕修改balance变量的代码部分。
当我将代码更改为Double时,没有错误,但我收到了一条注释:
This element has no attached source and the Javadoc could not be found in the attached Javadoc
此外,代码不起作用,因为我的值最终都出错了。
问题:
由于
这是一些代码......
声明:
private Double balance;
构造
this.balance = new Double(balance);
锁定:
synchronized(balance){
balance = balance + amount;
}
答案 0 :(得分:1)
我的理论是否正确,我应该只能锁定Balance变量?
没有
synchronized(balance) {
balance = balance + amount;
}
当您锁定balance
时,您确实锁定的Double
实例是 {/ 1>}的{em>值,而不是balance
变量。但是,您使用不同的balance
实例替换 balance
中的值。如果某个其他线程出现,它可能会看到新的Double
并在当前线程释放它(仍然)保留在旧Double
上的锁之前获取锁。换句话说,你没有得到适当的互斥。此外,不满足“之前发生”关系的前提条件,因此线程可能会看到共享变量和对象的不一致版本。
如果要锁定实例变量,则需要锁定它是实例的对象。
如何让我的代码识别Double的Java.lang代码?
这是一个IDE问题。 IDE无法找到与IDE已配置使用的“rt.jar”文件对应的源JAR文件。这很可能是因为您要在IDE中使用JRE中的“rt.jar”文件。解决方案是重新配置IDE以使用与JRE对应的JDK。
请注意,这不会改变程序的工作方式。它只影响IDE在(例如)单步进入核心类时向您显示源代码的能力。