元素没有附加的源代码Java.Lang
您好,我正在尝试使用Double对象,而不是类型来同步线程。这是一个家庭作业 概述:此应用程序是银行系统的一个简单示例,它具有作为存款人运行的线程和作为取款人运行的线程。储户增加10美元,取款人删除10美元,因此应用程序末尾应有10个不变的银行帐户 在每个类(储户和取款人)中,我都能够在account对象上使用块同步来实现目标。所以作业的家庭作业部分已经完成了,我不需要任何帮助 我开始思考,我觉得锁定整个Account对象太过分了。因为事务中唯一真正重要的部分是更改变量元素没有附加的源代码Java.Lang,java,javadoc,Java,Javadoc,您好,我正在尝试使用Double对象,而不是类型来同步线程。这是一个家庭作业 概述:此应用程序是银行系统的一个简单示例,它具有作为存款人运行的线程和作为取款人运行的线程。储户增加10美元,取款人删除10美元,因此应用程序末尾应有10个不变的银行帐户 在每个类(储户和取款人)中,我都能够在account对象上使用块同步来实现目标。所以作业的家庭作业部分已经完成了,我不需要任何帮助 我开始思考,我觉得锁定整个Account对象太过分了。因为事务中唯一真正重要的部分是更改变量 balance 最初
balance
最初,可变余额是双精度的。我的目标是将变量更改为Double对象,然后将同步块移动到account对象内部,并且仅移动到修改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;
}
我的理论正确吗,我应该只能锁定平衡变量
没有
当您锁定balance
时,实际上是在锁定Double
实例,该实例是balance
的值,而不是balance
变量。但是,然后用另一个Double
实例替换balance
中的值。如果出现其他线程,它可能会看到新的Double
,并在当前线程释放它(仍然)保留在旧的Double
上的锁之前获取该线程上的锁。换句话说,你没有得到适当的互斥。此外,不满足“之前发生”关系的先决条件,因此线程可能会看到共享变量和对象的版本不一致
如果要锁定实例变量,则需要锁定它是其实例的对象
如何让代码识别Double的Java.lang代码 这是一个IDE问题。IDE找不到与IDE配置使用的“rt.JAR”文件对应的源JAR文件。这很可能是因为您必须使用IDE才能在JRE中使用“rt.jar”文件。解决方案是重新配置IDE以使用对应于JRE的JDK
请注意,这不会改变程序的工作方式。它只会影响IDE在(例如)单步进入核心类时显示源代码的能力。在第二个问题中,应该是“java.lang”而不是“java.lang”(在包名中,我们只使用小写字母)。确实,有时锁定整个对象是过度的,对性能有害。但另一方面,锁定关键资源上的调用有时是不够的。某些操作必须“原子化”完成,因此必须作为块锁定。通常,“读-改-写”-块是这方面的候选块。在您一直在更改资源并且尚未将其写回后,您不希望另一个线程更改该资源。@JB您希望看到什么代码?这是一个非常微不足道的例子。更多的是关于这个理论的问题。我不认为发布两行代码会有任何帮助。我想我不想看到代码重现您的问题。如果可能的话,就发一些,否则你可能看不到正确的答案。@Special--k-投票不支持努力。他们是为了这个问题的质量。人们不理解这个问题的事实在一定程度上反映了问题的写作方式。
synchronized(balance) {
balance = balance + amount;
}