单例模式是我们一个非常常用的一个设计模式,一些耗费资源的对象我们只希望它只有一个的时候我们就要用到单例模式了。单例模式又分为饿汉式和懒汉式,下面就又我来详细分享一下这两种模式
1.饿汉模式
这个是饿汉单例类
class Singleton
{
private static Singleton instance=new Singleton();
public Singleton()
{
}
public static Singleton getSingleton()
{
return instance;
}
}
这个是测试类
public class Test
{
public static void main(String args[])
{
Singleton s1=Singleton.getSingleton();
Singleton s2=Singleton.getSingleton();
if(s1==s2)
{
System.out.println("s1与s2是同一个对象!");
}else{
System.out.println("s1与s2不是同一个对象!");
}
}
}
运行结果如下:
饿汉单例模式的特点是在加载类的时候就把对象创建好,所以加载类的速度会比较慢。但是正是因为这个原因,所以获取对象的速度会比较快。而且不用考虑线程安全问题
2.懒汉模式
这个是饿汉单例类
class Singleton
{
private static Singleton instance;
public Singleton()
{
}
public static Singleton getSingleton()
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
}
下面是测试类
public class Test
{
public static void main(String args[])
{
Singleton s1=Singleton.getSingleton();
Singleton s2=Singleton.getSingleton();
if(s1==s2)
{
System.out.println("s1与s2是同一个对象!");
}else{
System.out.println("s1与s2不是同一个对象!");
}
}
}
运行结果如下:
饿汉单例模式的特点是在对象第一次获取的时候创建的,所以加载类的时候会比较快,但是因为是第一次获取的时候创建的所以第一次获取的时候会比较慢,而且线程不安全,在两个JVM同时第一次创建这个单例对象的时候就有可能出现这种情况了:
上面的是《Head First设计模式》188页上面的图,那有没有办法破解呢,肯定有啊,就是使用同步代码块,但是如果直接在getSingleton方法定义为同步方法的话就会出现一个问题,效率变得极其得慢,而且出现线程问题只是第一次获取对象的时候,把整个方法同步实在有点浪费和不好了,所以我们可以采用“双重检验加锁”的方法来减少同步。
class Singleton
{
private volatile static Singleton instance;
public Singleton()
{
}
public static Singleton getSingleton()
{
if(instance==null)
{
synchronized(Singleton.class)
{
if(instance==null)
{
instance=new Singleton();
}
}
}
return instance;
}
}
使用这个方法就能大大减少同步带来的问题啦,这次分享的内容就这么多,下次见啦!