多线程下的单例
一、饿汉式
class Single
{
private static final Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}
二、懒汉式
方式一:同步函数
class Single
{
private static Single s = null;
private Single(){}
public static synchronized Single getInstance()
{
if(s==null)
// -->0 -->1
s = new Single();
return s;
}
}
这种方式能够解决线程安全问题,但是效率低,因为多个线程取getInstance得时候,不可避免的每次都需要先去判断一下锁,然后才去判断if(s==null),这样就 降低了效率。
方式二:同步代码块
加入同步为了解决多线程安全问题。
加入双重判断是为了解决效率问题。
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)//只有s==null的时候才会去判断锁,此处是为了效率而生
{
synchronized(Single.class) //为了线程的安全
{
if(s==null)
// -->0 -->1
s = new Single();
}
}
return s;
}
}
class SingleDemo
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}