/*************实现单键模式Singleton*************/
public class Singleton
{
/*
简单实现方式一,不适合在多线程环境下使用
*/
public class Singleton1
{
//创建instance实例
private static Singleton1 instance;
//构造函数设为private,即外界不可访问的
private Singleton1()
{
}
//注意不能由构造函数创建对象,故只能使用类方法进行外界访问
public static Singleton1 getInstance()
{
if(instance == null)/*这里多环境下判断则容易出错,比如一个线程判断为null时,还未执行创建实例
另一个线程即立刻进行判断,此时结果仍为null,运行结果则会创建两个实例*/
{
instance = new Singleton1();
}
return instance;
}
}
/*实现方法二,使用Lock锁方式*/
public final class Singleton
{
private static Singleton instance;
//设置锁
private static Lock mylock = new ReentrantLock();
private Singleton()
{
}
public static Singleton getInstance()
{
mylock.lock();
try
{
if(instance == null)
{
instance = new Singleton();
}
return instance;
}
finally
{
mylock.unlock();//注意一定要在finally块中解锁
}
}
}
/*实现方法三:由于上述每一次获取instance时都需要获取锁,花费时间过大,则这里适当做了优化,即只有第一次
创建才进行判断*/
public final class Singleton3
{
private static Singleton3 instance;
//设置锁
private static Lock mylock = new ReentrantLock();
private Singleton3()
{
}
public static Singleton3 getInstance()
{
if(instance == null)
{
mylock.lock();//只有instance为null时,才立即上锁
try
{
if(instance == null)//注意这里要进行第二次判断
{
instance = new Singleton3();
}
}
finally
{
mylock.unlock();//注意一定要在finally块中解锁
}
}
return instance;
}
}
/*实现方法五*/
public final class Singleton4
{
private static Singleton4 instance = new Singleton4();//立即初始化,但这样较浪费资源
private Singleton4()
{
}
public static Singleton4 getInstance()
{
return instance;
}
}
/*实现方法六*/
public final class Singleton6
{
private Singleton6()
{
}
public static Singleton6 getInstacne()
{
return Inner.instance;
}
private static class Inner
{
final static Singleton6 instance = new Singleton6();
}
}
public static void main(String[] args)
{
}
}