您的位置:首页 > 其它

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

2017-01-02 20:55 274 查看
第一:双重检查优化,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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: