定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
1.单例模式的动机是:创建类的单一对象。
2.单例模式的分类:饿汉式单例模式和带双重检查锁定机制的懒汉式单例以及IoDH技术
3.需要注意的是:多线程环境创建成多例对象()。
4.场景问题:应用程序配置文件的读取、任务的分配等都可以用单例模式。
饿汉式单例模式:
public class signleton
{
private static signleton instance=new signleton();//程序载入类就会自动的实例化
private signleton(){
}
public static signleton getInstance(){
return instance;
}
public void test(){
System.out.println("饿汉式单例模式");
}
}
class client{
public static void main(String [] argv){
signleton inst1=signleton.getInstance();
inst1.test();
}
}
synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法,有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,直接运行。它包括两种用法:synchronized 方法(针对方法加锁)和 synchronized 块(针对代码块加锁)。
带双重检测锁定机制的懒汉式单例模式:
public class signleton
{
private volatile static signleton instance=null;
private signleton(){
}
public static signleton getInstance(){
if(instance==null){//第一重检查
synchronized(signleton.class){//锁定代码块
if(instance==null)//第二重检查
{
instance=new signleton();
}
}
}
return instance;
}
public void test(){
System.out.println("双重检查的锁定机制懒汉式单例模式");
}
}
class client{
public static void main(String [] argv){
signleton inst1=signleton.getInstance();
inst1.test();
}
}
IoDH 技术(针对多线程):
public class signleton
{
private static class holderclass{ //类的内部静态类
private static final signleton instance=new signleton();
}
private signleton(){
}
public static signleton getInstance(){
return holderclass.instance;
}
public void test(){
System.out.println("Initialization on demand holder");
}
}
class client{
public static void main(String [] argv){
signleton inst1=signleton.getInstance();
inst1.test();
}
}