java - 对对象的公共引用
问题描述
考虑以下代码大纲:
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();
}
}
现在,既然a1
和a2
是两个不同的对象,那么在打印 a 的值时值不应该是 1 吗?我错过了什么?B 的全局参考如何工作?我有点困惑。
解决方案
此代码应产生编译错误。
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(不一定因为代码不是线程安全的)。
推荐阅读
- firebase - Firebase Firestore 嵌套查询
- kubernetes - kubernetes:揭秘有关失败准备探测的警告
- python - 仅在一个轴上更改轴点之间的距离(比例)
- angular6 - Angular 6 从生成使用组件
- mockito - 在 Spring Boot 中未在 Mockito 中注入 Autowired
- apache - 如何使用 haproxy 在具有多个虚拟主机的同一服务器上路由特定虚拟主机
- arkit - RealityKit - 人脸锚
- java - Fineract API Post recurringdepositaccount 不起作用,并且它也没有包含在 Fineract 文档中
- flutter - Flutter Clipper 失败,bool 为 null
- javascript - 我应该在移动键盘上方使用媒体查询和转换: translateY(-%) 吗?