/**
* @author dean
* 最初的单例模式设计,注意两个static
*/
public class SingleTest {
private static SingleTest singleton;
private SingleTest(){
}
public static SingleTest getInstance()
{
if(singleton == null)
singleton = new SingleTest();
return singleton;
}
}
/**
* @author dean
* 在多线程并发的情况下,还是有可能造成单例对象被多次new出来(仅仅在第一次getInstance()的时候可能发生)
*
* synchronized 同步一下 getInstance()吧
*/
public class SingleTest2
{
private static SingleTest2 singleton;
private SingleTest2(){
}
public synchronized static SingleTest2 getInstance()
{
if(singleton == null)
singleton = new SingleTest2();
return singleton;
}
}
/**
* @author dean
*
* 如果不考虑性能的话SingleTest2的做法已经可以了
* 因为synchronized需要一些检测,会耗费一点时间,而且按SingleTest2的写法,每次getInstance的时候都需要检测
* 很耗性能,改进一下,利用volatile和synchronized同步块
*/
public class SingleTest3
{
/**
* volatile 保证多线程并发的情况下,对同一个变量使用的是同一块内存
*/
private volatile static SingleTest3 singleton;
private SingleTest3(){
}
public static SingleTest3 getInstance()
{
if(singleton == null)
// 这里只是在第一次执行的时候会检测一下,之后就不会再进行synchronized检测了
synchronized(SingleTest3.class){
singleton = new SingleTest3();
}
return singleton;
}
}