2

我在下面有这段代码,如图所示。我们的应用程序运行在由负载均衡器控制的 5 个 Web 服务器上,所有服务器都连接到一个 Memcache 实例。

我猜这一段同步仅适用于一个 Instance 。

请让我知道当 5 个 Web 服务器尝试访问 Memcache 时如何同步这段代码

public class Memcache {
    private MemcachedClient memclient = null;  
    private static Memcache instance = null;

    public static Memcache getInstance() {
        if (instance == null) {
            try {
                synchronized (Memcache.class) {
                    instance = new Memcache();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        return instance;
    }

    private Memcache() throws IOException {
        MemcachedClientBuilder builder = new XMemcachedClientBuilder();
        memclient = builder.build();

    }

}
4

2 回答 2

6

为什么不这样初始化呢?

private static Memcache instance = new Memcache();

请记住,您在此处尝试实现的同步是有问题的,
因为两个线程可能会通过 (if (instance == null) (上下文切换可能在该行之后)
所以您可以考虑双重检查模式
BUt在某些版本的 java 中存在问题。
在我提供的链接中,有关于问题的信息,
链接中,您可以使用 volatile 关键字阅读有关 Singleton 的信息。

我仍然会选择我上面建议的选项。

于 2012-11-01T07:07:58.733 回答
0

您可以使用延迟初始化的 ClassHolder 模式来实现对类的同步访问。因为 Memcache 是使用静态初始化器初始化的,所以它不需要更多的同步构造。任何线程对 getInstance() 的第一次调用会导致 MemcacheHolder 被加载和初始化,并且 Memcache 实例使其自身可用于调用代码。

public class MemcacheFactory{

  private static class MemcacheHolder {
        public static Memcache instance = new Memcache();
    }

    public static Memcache getInstance() {
        return MemcacheFactory.MemcacheHolder.instance;
    }

}
于 2012-11-01T08:18:11.743 回答