gpt4 book ai didi

java - 从正确的对象引用中使用 volatile 变量

转载 作者:行者123 更新时间:2023-12-01 10:25:32 26 4
gpt4 key购买 nike

我想在新线程中创建一个对象,这将创建另一个线程。在最后创建的线程中,我需要创建该线程的确切对象中的变量引用。到目前为止我有这段代码:

主要

public static void main(String[] args) {
for(int i = 0; i < 2; i++){
ClassThread ct = new ClassThread();
Thread t = new Thread(ct);
t.start();
}
}

类线程

public static volatile int liczba = 1;
private static int id = 0;

@Override
public void run() {
for(int i = 0; i < 2; i++){
Class1 cla = new Class1(liczba, id);
Thread t = new Thread(cla);
t.start();
id++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

1级

private volatile int var;
private int id;

public Class1(int _var, int _id) {
var = _var;
id = _id;
}

@Override
public void run() {
while(true){
System.out.println("Thread: " + id + " : " + var);
var++;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

最佳答案

如果您需要从一个线程获取另一个线程的 int 引用,则必须指定您自己的 MutableInteger 类,或者使用 AtomicInteger 。原子整数具有积极的副作用,因为可以使操作原子化。有关更详尽的答案,请参阅This answer .

如果问题涉及非原始类型,您可以简单地将所需的引用传递给构造函数,就像您已经尝试做的那样。该对象内部状态的任何更改都将反射(reflect)到引用的所有持有者。有些对象是不可变的(String 可能是最知名的,但请注意,IntegerLong 等的工作方式相同。 ),因此不能以这种方式使用。

请注意,如果您传递引用,则对内部引用 var = "hello"; 所做的任何分配都不会影响类之外的任何内容。您只需将您的私有(private)引用交换为另一个引用,将所有其他对旧对象的引用保留原样。这与 Java 始终 pass-by-value 这一事实有关。 .

关于java - 从正确的对象引用中使用 volatile 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35373603/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com