Java中的单例模式并发访问

4
我有一个单例对象,它包含一个方法,该方法没有进行同步。这个单例可以同时被多个客户端访问,如果有多个客户端访问该对象,会发生什么?对象引用是按照先到先服务的方式提供给它们吗?也就是说,一个客户端必须等待第一个客户端完成对象,还是会在内存中给出相同的对象引用?
我对单例中未同步的方法感到奇怪。如果两个客户端调用Singleton.method(param),参数不同,他们之间不会产生问题,对吗?
2个回答

7
如果你的方法没有使用任何共享状态(例如单例字段),那么这是完全安全的。方法参数会被传递到线程栈上 - 这是本地的并且独占于此栈。
想象两个处理器运行相同的代码但在内存中操作不同的区域。

谢谢。但我仍然不明白,如果由于单例模式在内存中没有两个对象,那么堆栈上会有两个相同类的方法吗? - WinOrWin
2
你的单例对象(其实例字段)位于堆上。单例对象方法的代码位于PermGen内存中(每个加载的类一次,而不是对象)。方法参数在堆栈上传递,局部于每个线程。三个不同的内存位置,建议你多了解一下。 - Tomasz Nurkiewicz

3

单例意味着只应该有一个类的实例。如果单例没有正确实现,这可能并不是真的。最安全的方式是将其声明为枚举

如果存在未同步的方法,则意味着多个线程可以同时执行该方法的主体。如果单例是不可变的,则不必担心。否则,您应该注意可能的不一致性。一个线程可以在另一个线程正在进行相同操作时更改状态,导致难以调试的不可预测结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接