元素没有附加的源代码Java.Lang

元素没有附加的源代码Java.Lang,java,javadoc,Java,Javadoc,您好,我正在尝试使用Double对象,而不是类型来同步线程。这是一个家庭作业 概述:此应用程序是银行系统的一个简单示例,它具有作为存款人运行的线程和作为取款人运行的线程。储户增加10美元,取款人删除10美元,因此应用程序末尾应有10个不变的银行帐户 在每个类(储户和取款人)中,我都能够在account对象上使用块同步来实现目标。所以作业的家庭作业部分已经完成了,我不需要任何帮助 我开始思考,我觉得锁定整个Account对象太过分了。因为事务中唯一真正重要的部分是更改变量 balance 最初

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

概述:此应用程序是银行系统的一个简单示例,它具有作为存款人运行的线程和作为取款人运行的线程。储户增加10美元,取款人删除10美元,因此应用程序末尾应有10个不变的银行帐户

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

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

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

当我将代码更改为Double时,没有错误,但我得到一个提示:

This element has no attached source and the Javadoc could not be found in the attached Javadoc
此外,代码不起作用,因为我的值最终都是错误的

问题:

  • 我的理论正确吗,我应该只能锁定平衡变量
  • 如何让代码识别Double的Java.lang代码
  • 谢谢

    这里有一些代码

    声明:

    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;
    }