JAVA封装学习笔记3--单例模式

为什么80%的码农都做不了架构师?>>>   hot3.png

单例模式(singleton):

  一个类只有一个实例。(比如提高数据库的访问效率)

两种:  饿汉    懒汉

如何保证类只有一个实例?如何让外部类不能new---把构造方法搞成私有的。如下:

public class Singleton{
    private Singleton(){
}
public static Singleton getInstance(){//得到实例
    return new Singleton();
}
}


那么这样真的能保证只有一个实例?      

Singleton s1 = Singleton.getInstance();
Singleton s1 = Singleton.getInstance();


很显然s1,s2不是同一个Singleton.

那么究竟应该怎么做?看下面的代码:

public class Singleton{
    private Singleton(){
}
private static Singleton singleton =  new Singleton();
public static Singleton getInstance(){//得到实例
    return singleton;
}
}

这样一来,显然就只能一个了,每次调用Instrance代码,都返回静态singleton。

这种方法叫做饿汉式。下面还要讲一种叫做懒汉式的单例模式。

首先看下面代码:

public class Singleton{
    private Singleton(){
}
private static Singleton singleton =  null;
public static Singleton getInstance(){//得到实例
      if(singleton == null){
            singleton = new Singleton();
        }  
return singleton;
}
}

首先声明static singleton为空,在使用的时候在创建,这种方式叫做懒汉式。在这里,需要注意线程安全问题。

   如果多线程需要访问实例,当多个线程调用Instance()方法时可能出现创建两个实例,等等问题。此处,我们要加一个线程锁synchronized。如下:

public class Singleton{
    private Singleton(){
}
private static Singleton singleton =  null;
public synchronized static Singleton getInstance(){//得到实例
      if(singleton == null){
            singleton = new Singleton();
        }  
return singleton;
}
}

注意:

在多个JVM系统的分散式系统中

在一个JVM中有多个类加载器

转载于:https://my.oschina.net/qkmc/blog/657747

你可能感兴趣的:(JAVA封装学习笔记3--单例模式)