-1

您好我正在尝试使用双对象,而不是类型来同步线程。这是一个家庭作业。

概述:此应用程序是银行系统的一个简单示例,它具有作为存款人运行的线程和作为取款人运行的线程。存款人添加 10 美元,取款人删除 10 美元,因此应用程序结束时应该有 10 个未更改的银行账户。

在每个类别(存款人和取款人)中,我都能够在帐户对象上使用块同步来实现目标。所以我的作业的家庭作业部分已经完成,我不需要帮助。

我开始思考,我觉得锁定整个 Account 对象太过分了。因为交易中唯一真正重要的部分是改变变量

 balance

最初可变余额是双倍的。我的目标是将变量更改为 Double 对象,然后将同步块移动到 account 对象内部,并且仅围绕修改 balance 变量的代码部分。

当我将代码更改为 Double 时,没有错误,但我收到一条注释:

This element has no attached source and the Javadoc could not be found in the attached Javadoc

此外,代码不起作用,因为我的价值观最后都错了。

问题:

  1. 我的理论是否正确,我应该只能锁定 Balance 变量?
  2. 如何让我的代码识别 Double 的 Java.lang 代码?

谢谢

这是一些代码...

宣言:

private Double balance;

构造函数:

this.balance = new Double(balance);

锁定:

synchronized(balance){

balance = balance + amount;

}
4

1 回答 1

1

我的理论是否正确,我应该只能锁定 Balance 变量?

不。

synchronized(balance) {
    balance = balance + amount;
}

当您锁定 时balance,您实际上是在锁定作为Double的实例,而不是在变量上。但是然后你用不同的实例替换值。如果出现其他线程,它可能会在当前线程释放它(仍然)持有的旧锁之前看到新的并获取它的锁。换句话说,你没有得到适当的互斥。此外,不满足“之前发生”关系的先决条件,因此线程可能会看到共享变量和对象的不一致版本。 balancebalancebalanceDoubleDoubleDouble

如果你想锁定一个实例变量,你需要锁定它是一个实例的对象。


如何让我的代码识别 Double 的 Java.lang 代码?

这是一个 IDE 问题。IDE 找不到与 IDE 已配置为使用的“rt.jar”文件对应的源 JAR 文件。这很可能是因为您必须在 IDE 中使用 JRE 中的“rt.jar”文件。解决方案是重新配置您的 IDE 以使用与 JRE 对应的 JDK。

请注意,这不会改变您的程序的工作方式。它只会影响 IDE 在(例如)您单步进入核心类时向您显示源代码的能力。

于 2012-09-26T15:24:29.187 回答