<span style="font-size:18px;">class Single
{
<span style="white-space:pre"> </span>private static Single s = null;
<span style="white-space:pre"> </span>private Single()
<span style="white-space:pre"> </span>{}
<span style="white-space:pre"> </span>public static Single getInstance()
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>if(s=null)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>s=new Single();
<span style="white-space:pre"> </span>return s;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
}</span>
单例设计模式
单例设计模式常用于一个程序中只需要生成一个实例对象的类,这个类通常用单利模式来设计。
1,懒汉式
私有化构造函数,不可以被new对象,封装一个静态的本类对象,懒汉式不会先创建这个对象只是先声明这个本类对象,对外提供一个方法 getInstance()获取被封装的本类对象,
等到需要这个对象的时候就可以调用这个方法获取此类对象。上面的例子在多线程的情况下会有运行隐患,如果多个线程有可能都判断到S=null的情况从而产生多个对象,所以要加锁。
<span style="font-size:18px;">public class Single {
private static Single s = null;
private Single()
{
//构造代码
}
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class) //这里锁不加在if外面是而是采用在if里面加锁再进行一次if判断是
{<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>//因为这样不用每次都进行加锁再进行条件判断了。
if(s==null)<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>//如果在里面加上锁不进行第二次if判断,线程还是不安全的
s=new Single();
return s;
}
}
return s;
}
}</span>
2,饿汉式
<span style="font-size:18px;">class Single_2
{
private Single_2()
{
//构造代码
}
private static Single_2 s = new Single_2(); //进内存的时候就创建好了对象
public static Single_2 getInstance()
{
return s;
}
}</span>