从Head First设计模式书中,具有双重检查锁定的单例模式已实现如下:
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么volatile被使用.volatile使用不会 破坏使用双重检查锁定的目的,即性能?
java singleton design-patterns locking double-checked-locking
我在JVM(Scala)中构建了一个巨大的图形,我想重复使用它,调整算法.我不想每次都从磁盘重装它.有没有办法让它在一个JVM中连接而从另一个JVM连接,算法正在开发中?
假设您有n个进程,n> 2.您希望在它们之间达成协议,即一个进程是活动的.所以他们需要彼此投票以确定哪一个是活跃的.
所有进程都可能随时失败,我们希望尽可能让一个进程处于活动状态,但......
我们必须永远不要同时有两个活跃,所以如果他们不能确定没有一个活跃的更好.(即我们想避免裂脑)
它们之间唯一可用的通信机制是pub-sub消息传递(不是点对点).
可以使用一个或多个数据库,但没有一个数据库应该是单点故障.IE浏览器.如果所有流程都可以工作,那将是非常不受欢迎的,并且由于丢失了单个数据库而无法这样做.
设计?需要发布什么消息?
在技术讨论中,我遇到了如何跨节点维护单个实例的问题,然后我回答了以下方法
1)基于DB的解决方案
2)分布式缓存
3)分片
4)在负载均衡器中维护Singleton单实例
面试官期待更多的东西,因为他回复了数据库,而且Cache会工作,分片无法工作,也没有对负载均衡器方法的评论,然后他补充说,让我们假设你的应用程序中不允许使用DB和Cache方法,给我另一个选择我在这一点上被困住了.
然后我用Google搜索并找到以下内容
https://javaarchitectforum.com/2013/02/19/singleton-design-pattern-with-example/
还从应用程序服务器中找到了一些支持
http://www.onjava.com/pub/a/onjava/2003/08/20/jboss_clustering.html
http://docs.oracle.com/cd/E12840_01/wls/docs103/cluster/service_migration.html#wp1051458
请帮助我解决您的想法,这将是跨节点实现单个实例(单例)的最佳方法