java共享变量

java共享变量,java,Java,我想知道多个线程如何访问同一个变量。如果变量是非静态的,并且每个线程都是自己的线程对象,那么如何访问相同的变量?例如,假设我有一个函数,可以找到2D数组的最大值。如果每个线程找到一行的最大值,并且每个线程还维护该行的本地最大值,并将该本地最大值与共享最大值进行比较,并相应地更新共享最大值,那么如果您有不同的线程对象,您将如何访问共享最大值 例如,在这段代码中,我有 for(int i=0; i<input.length; i++){ rowArray = input[i]; teste r

我想知道多个线程如何访问同一个变量。如果变量是非静态的,并且每个线程都是自己的线程对象,那么如何访问相同的变量?例如,假设我有一个函数,可以找到2D数组的最大值。如果每个线程找到一行的最大值,并且每个线程还维护该行的本地最大值,并将该本地最大值与共享最大值进行比较,并相应地更新共享最大值,那么如果您有不同的线程对象,您将如何访问共享最大值

例如,在这段代码中,我有

for(int i=0; i<input.length; i++){
rowArray = input[i];
teste r1 = new teste(rowArray);
runnables.add(r1);
}

for(int i=0;i,>Java提供了,它保证每个线程将读取其当前值,而不是线程缓存的值。

在您的示例中,线程需要有一种方法来引用相同的“共享最大值”

两种方法是:

  • 将最大值设为静态变量(可疑)

  • 创建“最大”对象时,将其作为参数传递给线程

请注意,当多个线程访问同一变量时,必须采取步骤同步对该变量的访问(这样两个线程就不会同时修改它)


一种方法是使用
synchronized
statemtned

是的,因此我尝试将其作为参数作为构造函数传递给线程。不幸的是,这是按值传递,而不是按引用传递=/I给出了一个upvote,但是您错过了几个“共享”变量的选项,因此也错过了对象(这些不会以任何方式解决线程安全问题):1)在实现Runnable的对象中,使用成员变量(可以变异对象)2)如果Runnable对象是从非静态嵌套类创建的,则可以引用父级非静态成员(可以变异或赋值)3)如果可运行对象是从匿名内部类创建的,那么您可以访问作用域中的
final
变量(可以对对象进行变异)。此外,更为迂腐的是,问题在于分配给变量——任何共享对象修改都必须得到正确的保护,以避免潜在的并发性错误。