单例模式
什么是单例模式:
单例是一种常见的设计模式。使用单例模式的类只能有一个实例。servlet就是单实例多线程的。
实现思路:
1,私有化构造器,不允许外部调用构造器实例化该类。
2,提供一个静态方法供外部获取实例。
具体实现:
懒汉式:
public class SingleTon {
private static SingleTon singleTon;
//私有化构造方法
private SingleTon(){}
//提供获取该实例的静态方法
public static SingleTon getInstance(){
//判断是否实例化
if(singleTon == null){
singleTon = new SingleTon();
}
return singleTon;
}
}
不足:
多线程中不能保证单实例。
饿汉式:
public class SingleTon {
//私有化构造方法
private SingleTon(){}
private final static SingleTon singleTon = new SingleTon();
//提供获取该实例的静态方法
public static SingleTon getInstance(){
return singleTon;
}
}
不足:
类加载的时候实例化该对象,如果没有使用到该实例会浪费内存。
synchronized修饰方法实现同步:
public class SingleTon {
private static SingleTon singleTon;
//私有化构造方法
private SingleTon(){}
//提供获取该实例的静态方法
public static synchronized SingleTon getInstance(){
//判断是否实例化
if(singleTon == null){
singleTon = new SingleTon();
}
return singleTon;
}
}
不足:
使用synchronized 修饰方法,可以实现线程同步。但是每个需要获取该实例的线程都要排队,影响性能,可以更加细粒度(缩小synchronized 的范围)的使用synchronized 。
synchronized修饰代码块实现同步:
public class SingleTon {
private static SingleTon singleTon;
//私有化构造方法
private SingleTon(){}
//提供获取该实例的静态方法
public static SingleTon getInstance(){
if(singleTon == null){
synchronized(SingleTon.class){
if(singleTon == null){
singleTon=new SingleTon();
}
}
}
return singleTon;
}
}
除了这几种外,还有其他的实现方式,我目前水平有限也不太了解,等学习之后再补上吧。
作者:我要坚持写博客
来源:CSDN
原文:https://blog.csdn.net/hhdpk/article/details/85306821
版权声明:本文为博主原创文章,转载请附上博文链接!