我遇到一些与处理Singleton对象和并发调用事件时遇到的非常具体情况有关的问题。
我知道还有其他一些与我有关的问题,但它们并不是我想知道的。 (例如:Concurrently invoking Java method of singleton object)
比如说我有以下代码:
public class MyClass{
private static MyClass myInstance = new MyClass();
private new MyClass() {}
public MyClass getInstance(){
return myInstance;
}
public String doSomething(String message){
java.util.Date d = new java.util.Date();
System.out.println(message);
System.out.println("Today is: " + d);
}
}
在我多次调用同一个类实例的并发场景中,我想知道Date d
变量会发生什么,在内存方面,它是否会存储在不同的内存堆栈中的getInstance()。doSomething的()?
在我的理解中,因为类实例是静态的,但它没有声明可变的全局变量,它应该为不同的进程创建单独的d
对象,而根本没有并发问题。
有人可以澄清这部分吗?
答案 0 :(得分:2)
你是对的。每个线程都有自己的调用堆栈,并在其上放置d
引用。对象本身在堆中分配但JIT编译器甚至可以将它放在堆栈上,如果在escape analysis变量期间将其视为本地。在您的示例中,d
上没有争用,因此doSomething
可能被视为线程安全。
但是,您需要记住,如果“本地”对象对可变共享状态(例如可写静态字段)产生读/写操作,则线程可能会相互干扰。