2012-08-09 26 views
2

我在一次采访中被要求提出一个Singleton模式的设计/实现,我必须懒惰地加载类并且不使用同步关键字。我被呛了,不能拿出任何东西。然后我开始阅读java并发和concurrentHaspMap。请检查下面的imlpementation,并确认您是否发现Double check Locking或此实现的任何其他问题。不使用同步关键字的单例实现的懒惰初始化

package Singleton; 

import java.util.concurrent.ConcurrentHashMap; 

public final class SingletonMap { 

    static String key = "SingletonMap"; 
    static ConcurrentHashMap<String, SingletonMap> singletonMap = new ConcurrentHashMap<String, SingletonMap>(); 
    //private constructor 
    private SingletonMap(){ 

    } 
    static SingletonMap getInstance(){ 

     SingletonMap map = singletonMap.get(key);  
     if (map == null){ 
       //SingletonMap newValue= new SingletonMap(); 
       map = singletonMap.putIfAbsent(key,new SingletonMap()); 
       if(map == null){ 
        map = singletonMap.get(key);  
       } 
     }  
     return map; 
    } 
} 
+0

我认为他们想听到关于原子性的东西。 – gkuzmin 2012-08-09 07:54:02

+0

这个实现是不必要的复杂。有更简单的方法来创建一个单身 - 请参阅下面Peter和我发布的答案。 – munyengm 2012-08-09 08:35:48

回答

1

参见Bill Pugh's solution

public class Singleton { 
    // Private constructor prevents instantiation from other classes 
    private Singleton() {} 

    /** 
    * SingletonHolder is loaded on the first execution of 
    * Singleton.getInstance() or the first access to 
    * SingletonHolder.INSTANCE, not before. 
    */ 
    private static class SingletonHolder { 
     public static final Singleton INSTANCE = new Singleton(); 
    } 

    public static Singleton getInstance() { 
     return SingletonHolder.INSTANCE; 
    } 
} 
+0

只是想问你,如果我使用“公共静态最终Singleton INSTANCE =新的Singleton();”作为Singleton类成员变量的一部分,这可能会有什么不同? Inner类提供了什么好处? – Metalhead 2012-08-09 09:08:16

+0

只有在调用getInstance()或访问INSTANCE时才会创建静态内部类。在ClassLoader加载父类时,将创建一个静态实例变量。有关如何初始化静态实例变量的详细信息,请参阅Java语言规范。 – munyengm 2012-08-09 11:25:32

3

它很简单,如果你知道如何

enum Singleton { 
    INSTANCE; 
} 

INSTANCE是懒加载和线程安全的(和不使用任何形式的显式锁定)

+0

对不起,但我对枚举还不太了解,我想你也可能是对的,但是你可以评论我分享的实现吗?看到它有什么漏洞吗? – Metalhead 2012-08-09 08:02:55

+0

它可以创建多个SingletonMap,它比它需要的复杂得多。否则它可以工作。 – 2012-08-09 08:10:37