单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例,这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问改实例的方法;
实现:
代码实现:
懒汉试,线程不安全
/**
* @author Shuyu.Wang
* @package:com.shuyu.singleton
* @description:单列模式,懒汉式,线程不安全
* @date 2018-11-22 21:42
**/
public class Singleton1 {
private static Singleton1 singleton1;
//防止外界使用new 创建次类实例
private Singleton1(){
}
public static Singleton1 getInstance(){
if (singleton1==null){
singleton1=new Singleton1();
}
return singleton1;
}
}
双重锁:
/**
* @author Shuyu.Wang
* @package:com.shuyu.singleton
* @description:懒汉式,采用双锁机制,安全且在多线程情况下能保持高性能
* @date 2018-11-22 21:57
**/
public class Singleton2 {
private volatile static Singleton2 singleton2;
private Singleton2(){
}
private static Singleton2 getInstance(){
if (singleton2==null){
synchronized (Singleton2.class){
if (singleton2==null){
singleton2=new Singleton2();
}
}
}
return singleton2;
}
}
饿汉式:
/**
* @author Shuyu.Wang
* @package:com.shuyu.singleton
* @description:饿汉式,线程安全,没有加锁,效率高,类加载时初始化,浪费内存
* @date 2018-11-22 22:02
**/
public class Singleton3 {
private static Singleton3 singleton3=new Singleton3();
private Singleton3(){
}
private static Singleton3 getInstance(){
return singleton3;
}
}
测试代码:
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class SingletonApplicationTests {
@Test
public void contextLoads() {
Singleton1 singleton1=Singleton1.getInstance();
Singleton1 singleton2=Singleton1.getInstance();
if (singleton1==singleton2){
log.info("两个对象时相同的实例");
}
}
}
github代码地址:https://github.com/iot-wangshuyu/designpatterns/tree/master/singleton