使用来自正确对象引用的volatile变量

时间:2016-02-12 22:55:44

标签: java multithreading

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

主要

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

ClassThread

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

的Class1

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

1 个答案:

答案 0 :(得分:1)

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

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

请注意,如果您传递了引用,则对内部引用var = "hello";所做的任何分配都不会影响您班级以外的任何内容。您只需将您的私有引用交换为另一个引用,将所有其他引用保留为旧对象。这与Java总是pass-by-value

这一事实有关