接下来就说下单例模式了,这个在实际应用还是比较常用的!
首先,单例分为懒汉式和饿汉式:
饿汉式:类加载的时候,创建对象。 因此类加载速度慢, 线程相对安全
懒汉式:类加载的时候,不会创建对象,调用时才会创建对象。因此类加载速度快,线程相对不安全,一般要配合synchronized使用。
废话少说,下面是饿汉式:
支持延迟加载
public class Single {
//饿汉式:
private static Single single=new Single();
private Single() {
}
public static Single getSingle(){
return single;
}
}
单例模式思路:
- 私有属性
- 私有构造方法
- 公开的getSingle方法
单例模式作用:保证了对象的唯一性
- 适用场景:
1.需要生成唯一序列的环境
2.需要频繁实例化然后销毁
的对象。
3.创建对象时耗时过多或者耗资源过多
,但又经常用到的对象。
4.方便资源相互通信的环境
懒汉式如下:
不支持延迟加载。加了锁导致这个函数的并发度很低
public class Single2 {
//懒汉式:
private static Single2 single=null;
private Single2(){
}
/**
* 懒汉模式在使用时,容易引起不同步问题,所以应该创建同步"锁"
* @return
*/
public static Single2 getSingle(){
synchronized (this){
if(single==null){
single=new Single2();
}
}
return single;
}
}
双重检测机制
既保证了线程安全,又能做到延迟加载。
解决了懒汉式并发度低的问题
public class Singleton5 {
private static Singleton5 singleton5 = null;
private Singleton5() {
}
public Singleton5 getSingleton5() {
if (singleton5 == null) {
synchronized (Singleton5.class) { //类级别锁
if (singleton5 == null) {
singleton5 = new Singleton5();
}
}
}
return singleton5;
}
}
最后咱们来谈下,单例模式的优缺点:
优点:
1.实现了对唯一实例访问的可控
2.对于一些需要频繁创建和销毁的对象
来说可以提高系统的性能。
缺点:
1.
不适用于变化频繁的对象
2.滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出。
3.如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失。
以上有写的不对的地方,请及时通知博主,以做修改!!!!