Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有几种种形式,第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例
//注意这是private 只供内部调用
private static Singleton instance = newSingleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
第二种形式:
public class Singleton {
privatestatic Singleton instance = null;
publicstatic synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if(instance==null)
instance=new Singleton();
return instance; }
}
其他形式:
定义一个类,它的构造函数为private的,所有方法为static的。
一般认为第一种形式要更加安全些。
package blog.Javase.Thread;
/**
* 单例模式有两种写法:
* 1、饿汉式:创建实例的同时,在内存中开辟空间。
* 2、懒汉式:创建实例时,先不创建空间,使用时才去开辟空间。
* @author kevin
* @version v1.1
*/
public class SingletonDemo
{
public static void main(String[] args)
{
System.out.println("Singleton Instance");
}
}
/*
* 实现方式一:饿汉式
* 它的特点是实现简单,实例创建时即初始化并开辟空间,
* 多线程调用时不会产生安全性问题,因为方法中只有一条return语句。
*/
class Single
{
private static final Single instance = new Single();
private Single() {}
public static Single getInstance()
{
return instance;
}
}
/*
* 实现方式二:懒汉式
* 它的特点是:先创建实例,但是不开辟空间,当对象调用时才去初始化并开辟空间,使用了延迟加载;
* 在函数中语句较多,多线程访问时会出现线程安全性问题。
*/
class Single2
{
private static Single2 s = null;
private Single2(){}
public static synchronized Single2 getInstance()
{
if(s == null)
s = new Single2();
return s;
}
}
//面试中常考的单例模式,懒汉模式改进
class Single3
{
/*
* 懒汉式每次都要判断锁,占用了资源,为了提高效率,使用同步块改进.
*
* 懒汉式和饿汉式有什么不同呢?:
* 懒汉式的特点在于采用了实例的延迟加载;
* 延迟加载在多线程访问时会产生安全性问题;
* 可以加同步来解决;
* 同步函数和同步代码块都可以解决安全性问题,但是同步函数稍微有些低效,
* 用双重判断的形式能解决效率问题。
* 同步代码块在静态方法中使用的琐是该类所属的字节码文件对象。
*/
private static Single3 s = null;
private Single3(){}
public static Single3 getInstance()
{
if(s == null)
{
synchronized(Single3.class)
{
if(s == null)
s = new Single3();
}
}
return s;
}
}