Java中的多线程方法

Java中的多线程方法,java,multithreading,synchronization,Java,Multithreading,Synchronization,我完全不熟悉Java中的多线程。但我正在尝试创建一个多线程和线程安全的方法,下面是我到目前为止提出的方法。可以使用同一帐户在不同线程中使用源参数或目标参数调用此方法。因此,例如,带有帐户的线程1可能是源线程,而线程2可能是此传输的目标线程。谁能给我指一下正确的方向吗。我已经看过了这篇文章:以及网上其他解释同步工作原理的文章,我的假设是,通过在下面的代码块中放置synchronized,将锁定进程,直到它完成。然后,其他线程可以在之后拾取并处理其余的线程。我为我对这个话题的无知提前道歉。我只是希望

我完全不熟悉Java中的多线程。但我正在尝试创建一个多线程和线程安全的方法,下面是我到目前为止提出的方法。可以使用同一帐户在不同线程中使用源参数或目标参数调用此方法。因此,例如,带有帐户的线程1可能是源线程,而线程2可能是此传输的目标线程。谁能给我指一下正确的方向吗。我已经看过了这篇文章:以及网上其他解释同步工作原理的文章,我的假设是,通过在下面的代码块中放置synchronized,将锁定进程,直到它完成。然后,其他线程可以在之后拾取并处理其余的线程。我为我对这个话题的无知提前道歉。我只是希望有人能帮我找到正确的方向。有很多信息需要浏览,我只是希望得到一些专家的指导。提前谢谢

public static void transfer(BankAccount  source, BankAccount destination, int amount) {
    if (source.getAvailableFunds() >= amount) {
        synchronized (BankAccount.class) {
            source.setAvailableFunds(source.getAvailableFunds() - amount);
            destination.setAvailableFunds(destination.getAvailableFunds() + amount);
        }
    } else {
        throw new IllegalArgumentException("No funds in source: " + source);
    }

}
不同线程中的源和目标是什么意思

由于这是一个静态方法,您可以将其称为public synchronized static void transferand,并从内部删除syncronized块。 同样,作为一个静态方法可以确保这个类上的这个方法不会在JVM中并发执行

public syncronized static void transfer(BankAccount  source, BankAccount destination, int amount) {
    if (source.getAvailableFunds() >= amount) {
        source.setAvailableFunds(source.getAvailableFunds() - amount);
        destination.setAvailableFunds(destination.getAvailableFunds() + amount);
    } else {
        throw new IllegalArgumentException("No funds in source: " + source);
    }
}

这样,source.getAvailableFunds>=amount将永远不会与同时更改AvailableFunds的其他线程冲突。

请注意,同步是不可传递的。因此,如果您没有注意同步所有关键部分,其他线程可能会更改数据并导致不一致。这是正确的。为了完全控制资金流动同步,所有可能的操作都应该在一段同步的代码中处理。作为一个静态方法,可以确保此类上的此方法不会在JVM中并发执行,这是不正确的-不能保证静态方法不能并发执行。另外,整个方法是同步的这一事实并不意味着它永远不会与其他线程同时更改可用资金发生冲突——它只是保证没有其他线程可以同时执行相同的代码块。还有另一段代码可以同时更改相同的BankAccount对象字段。@xpa1492-我同意你的看法。同步是一个代码级概念。不是对象级别的概念。好吧,也许我不够清楚。但是transfer方法的调用者是多线程的,并且可以使用作为不同线程的源参数或目标参数的相同银行帐户来调用transfer方法。例如,线程1、帐户1可能是传输的源,而线程2可能是传输的目标。我需要使传输方法线程安全。它是否像将synchronized添加到此静态方法一样简单?或者我应该同步setAvailableFunds方法。这有意义吗?非常感谢您的回复。嗯,您的代码已经不是线程安全的了