一.什么是单例模式?
单例保证一个对象JVM中只能有一个实例,常见单例 懒汉式、饿汉式
什么是懒汉式,就是需要的才会去实例化,线程不安全。
什么是饿汉式,就是当class文件被加载的时候,初始化,天生线程安全。
实例:要点:构造方法私有化
package com.edu.emple2;
/**
* @author shkstart
* @date 2019/6/11- 22:15
*/
//保证在jvm中只能有一个实例
class Singleton{
//懒汉式,当需要时才会创建对象
static private Singleton singleton;
//构造函数私有化
private Singleton(){
}
//保证返回一个实例
static public synchronized Singleton getSingleton(){
if(singleton == null){
Singleton singleton = new Singleton();
}
return singleton;
}
}
public class Test004 {
public static void main(String[] args) {
Singleton s1 = Singleton.getSingleton();
Singleton s2 = Singleton.getSingleton();
System.out.println(s1==s2);
}
}
结果:
但是会产生线程不安全的情况,如何解决?
答:加synchronized关键字
//保证返回一个实例,只有一个线程访问getSingleton方法
static public synchronized Singleton getSingleton(){
if(singleton == null){
Singleton singleton = new Singleton();
}
return singleton;
}
但是这样效率会非常低,因为加入synchronized 只允许一个线程访问,当singleton 不等于null,还只允许一个线程访问,这样效率会很低。
解决办法:在singleton == null 时再加锁
//保证返回一个实例,只有一个线程访问getSingleton方法
static public Singleton getSingleton(){
if(singleton == null){
synchronized(Singleton.class){ //静态的,用当前字节码文件上锁
if(singleton == null){ //双重检验锁
Singleton singleton = new Singleton();
}
}
}
return singleton;
}