王学岗单例模式的优化————双重检查、枚举、内部类、容器管理

来源:互联网 发布:王陆807使用方法知乎 编辑:程序博客网 时间:2024/06/06 16:26

第一:双重检查优化,ImageLoader用的就是这种

这里写图片描述

package com.example.shuangchongjiancha;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;    }}

枚举类实现单例

package com.example.shuangchongjiancha;public enum Singleton {    //该枚举类只有一个对象instance;}

静态内部类实现单例模式

package com.example.shuangchongjiancha;public class Singleton {    private static class SingletonHolder {        private static Singleton singleton = new Singleton();    }    public static Singleton getInstance() {        return SingletonHolder.singleton;    }}

容器管理
联想:Java服务器连接池

package com.example.shuangchongjiancha;public class Singleton {}
package com.example.shuangchongjiancha;import java.util.HashMap;public class ObjectManager {    private static HashMap<String, Object> hashMap = new HashMap<String, Object>();    private static int MAX_SIZE = 5;    private ObjectManager() {    }    public static Object get(String key) {        Object instance = hashMap.get(key);        if (instance == null && hashMap.size() < MAX_SIZE) {            instance = new Singleton();            hashMap.put(key, instance);        }        return instance;    }    public static void put(String key, Object value) {        Object instance = hashMap.get(key);        if (instance == null && hashMap.size() < MAX_SIZE) {            instance = new Singleton();            hashMap.put(key, instance);        }    }}
package com.example.shuangchongjiancha;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ObjectManager.put("a", "aaa");        ObjectManager.put("b", "aaa");        Object s1=ObjectManager.get("a");        Object s2=ObjectManager.get("b");        //s1和s2不是同一个对象        System.out.println(s1);        System.out.println(s2);    }}
0 0