A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© netboy032 中级黑马   /  2012-12-28 11:19  /  1312 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Singleton{
  2.       private Singleton(){}
  3.      
  4.       private static class SingletonContainer{
  5.             private static Singleton si = new Singleton();
  6.      }
  7.      
  8.       public static Singleton getSingleton(){
  9.             return SingletonContainer. si;
  10.      }
  11. }
复制代码
1.上面这个单例类会不会有多线程的问题?到底是懒汉式还是饿汉式?解释下
2.用多线程的方式解决了懒汉式的问题,我想问能不能用代码写出来,我说的是能运行的代码?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

2 个回复

正序浏览
1.你这个是饿汉式。懒汉式:对象在方法被调用时才初始化,也叫对象的延时加载
饿汉式:类进存,对象还没有存在,只能调用其对外的方法才能创建对象。
开发是一般都用饿汉式
2.多线程解决懒汉式的问题
class Single{
        private static Single s = null;
        private Single(){}
       
        public static Single getInstance(){
                if(s == null){
                        synchronized(Single.class){
                                if(s == null){
                                        s = new Single();
                                }
                        }
                }
                return s;
        }
}
这样就行了

懒汉式的特点在于实例的延时加载,如果多线程时会出现安全问题。如何解决,加同步
用双重判断的方式,但会有效率问题,加同步的时候使用的锁是哪个,该类在内存中的
字节码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
private static GlobalConfig instance = null;  
    private Vector properties = null;  
    private GlobalConfig() {  
      //Load configuration information from DB or file  
      //Set values for properties  
    }  
    private static synchronized void syncInit() {  
      if (instance == null) {  
        instance = new GlobalConfig();  
      }  
    }  
    public static GlobalConfig getInstance() {  
      if (instance == null) {  
        syncInit();  
      }  
      return instance;  
    }  
    public Vector getProperties() {  
      return properties;  
    }  
同时更新某些属性的实例

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马