public class Singleton{
  
   private Singleton(){};
   private Map map = new HashMap();//非静态的成员变量
   private static Singleton single = new Singleton();
   public static Singleton getSingleton(){
      return single;
    }
}

解决方案 »

  1.   

    安全的,最后获取实例的方法就是getSingleton,这个是统一的入口。楼主的主要担心点在哪里呢,不妨说出来
      

  2.   

    我考虑的是如果是多个线程同时修改map那么就会造成一个线程读取到另一个线程修改后的map
      

  3.   

    你的map是私有变量,你不初始化实例怎么读得到map?
    根本不存在同时修改MAP的情况。
      

  4.   

    哦 写的时候没有注意 应该是public ,那如果是public呢?会存在问题吧
      

  5.   

    这应该根据懒汉模式为什么不安全来理解吧,
     public static Singleton getInstance() {
           if (single == null) {
               single = new Singleton();
           }
           return single ;
        }
    这里当并发访问的时候,当第一个线程过来发现single为null,这时进入if中准备new(还未new完成),此时另外一个线程也过来了,发现single依然为空,然后也进if中new了一个,这样就有new了2个single实例,也就不符合单例设计模式了,所以- -
      

  6.   

    http://zz563143188.iteye.com/blog/1847029
    这篇文章已经能解决你的问题了如果public确实存在安全问题而且文章上说单例模式这样写也容易出现问题。具
      

  7.   

    如果单例时考虑线程安全方面的问题,可以用threadlocal,如下:/**
     * 单例模式:ThreadLocal实现 
     */
    public class Singletion4 {
    //每个ThreadLocal与当前线程绑定,用其注册当前对象
    private static ThreadLocal<Singletion4> tl = new ThreadLocal<Singletion4>(); 

    private Singletion4(){};

    public static Singletion4 getInstance(){
    if(tl.get()==null){ //如果为空创建对象并放入ThreadLocal
    tl.set(new Singletion4());
    }
    return tl.get();
    }
    }
      

  8.   

    你们都把楼主的意思理解错了。
    单例模式就是保证在内存中只存在一个该类型的实例对象,不管是饿汉式,懒汉式,都要保证这一点。大家都理解的很好。
    楼主的问题是 “我考虑的是如果是多个线程同时修改map那么就会造成一个线程读取到另一个线程修改后的map ” 考虑的是多个线程操作这个实例变量时,会对其属性造成安全问题。
    单例模式虽然保证在内存中之存在一个该类型的实例对象。但如果要对其实现线程安全,在对map修改时,还是要加同步的,也就是线程安全问题还是存在的