首页 > 解决方案 > 对对象的公共引用

问题描述

考虑以下代码大纲:

class B {
    int a = 0;
    void method1() {
        // code
        a = a + 1;
    }
}

public class A extends Thread {

    static B obj1;

    public void run(){
       obj1.method1();
    }

    public static void main(String args[]){
        obj1 = new B();
        A a1 = new A();
        a1.start();
        A a2 = new A();
        a2.start();      
    }
}

现在,既然a1a2是两个不同的对象,那么在打印 a 的值时值不应该是 1 吗?我错过了什么?B 的全局参考如何工作?我有点困惑。

标签: javamultithreading

解决方案


此代码应产生编译错误。

B 的全局参考如何工作?

它没有。obj1(B 类类型)是 A 类的非静态成员。主要方法是静态的,并不真正在任何 A 类对象的上下文中运行。为此,主函数(静态函数)不能直接访问obj1。

obj1 = new B();

在上面的行中,没有 obj1 的实际内存来存储由new B(). obj1 的两个不同内存作为 a1 和 a2 的一部分创建,需要作为 a1.obj1 和 a2.obj2 访问。因此,不会创建任何类型的全局引用。

通过将 obj1 设为静态可以实现您可能尝试做的事情。

static B obj1;

这可以使 obj1 充当全局引用,因为它的内存不是任何 A 类对象的一部分。这将使两个线程更新相同的变量,使 obj1.a 的值变为 2(不一定因为代码不是线程安全的)。


推荐阅读