第一:双重检查优化,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);
}
}