我想你必须区分你已经在内存中存储的内容和代码执行。

在一个Singleton对象中,你有:

>字段:它们存储在内存中。它们可以在多个线程之间共享,您不能保证它们保持一致(除非您使它们同步)。

要调用的方法:可以从多个线程调用它们。每个执行是独立的和线程安全的,除非他们访问不正确的共享字段。

现在来讨论你的问题:如果你在多个线程之间共享你的单例对象并同时访问它,那么每个线程都将执行Singleton对象的代码部分,包含在它自己的执行中。

另外如果你写一个Thread.currentThread()。getId();它基本上将您执行的线程ID返回到单例方法中,您将获得不同的ids,因为不同的线程正在执行自己的方法堆栈。无国籍意味着你没有任何领域的单身人士在他们之间分享!

关于无国籍和有状态的一句话

无状态意味着bean没有任何可修改的字段来共享。这意味着你在对象中只有方法或/和静态的东西,所以你可以在任何地方使用它们,总是返回相同的结果。您不必担心同步该字段的访问。

这是无状态的一个基本示例,假设你有一个只执行sum操作的类:

public class StatelessClass{
public int sum(int a, int b){
return a+b;
}
}

以同样的方式,您可以将其声明为抽象类(不可实例化),并使其方法成为静态,这意味着您不需要任何实例来调用其方法:

public abstract class StatelessClass{
/**
* I only sum objects
*/
public static int sum(int a, int b){
return a+b;
}
}

那么你可以使用它作为StatelessClass.sum(1,1);这实际上将是非常相似的,有一个Singleton对象本身,区别在于在Singleton你有一个唯一的实例在应用程序中共享。

以同样的方式,将一个被注入的字段提供给服务的访问也不被认为是改变对象的状态:

public class StatelessServiceClass{
private Service service;
public int sum(int a, int b){
return service.sum(a,b);
}
public void setService(Service serv){
this.service=serv;
}
}

但是,有一个可修改的字段使对象有效:

public class StatefulClass{
//This fields make the object STATEFUL
private int totalSum = 0;
public int sum(int a, int b){
int sum = a + b;
totalSum = totalSum + sum;
if (totalSum > 100)
System.out.println("This thread "+Thread.currentThread().getId()+
+" got it!");
return sum;
}
}

同时可以通过多个线程访问总和,您应该保证以同步的方式访问totalSum。打印的句子不能保证是真的,除非你这样做。