------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
单例模式:所谓的单例模式就是说程序运行中保证程序操作的对象是同一个对象,单例模式分为两种单例模式一种是懒汉式,一种是饿汉式单例模式
下面先贴出两种单例模式的代码:
//饿汉式
//Single类一进内存,就已经创建好了对象。
class Single
{
private static Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}
这种单例模式叫做饿汉式单例模式,上来先创建一个对象,不管你用不用,就像一个饿汉,上来先强几个饼子,不管吃不吃得完一样,所以这个名字我感觉就是这么得来的嘻嘻
饿汉式单例模式是最常用,也是推荐的单例模式,不会产生线程安全问题。一般推荐使用饿汉式
懒汉式,就是用的时候才创建对象:代码如下
//懒汉式
class Single
{
private static Single s=null;
private Single(){}
public static Single getInstance()
{
if(s==null)
s=new Single();
return s;
}
}
懒汉模式容易产生线程安全问题,例如线程1,在通过Single.getInstance()获得实例时候,刚好,在判断完s后,s为空后,sleep()了,然后线程2进来判断s是否为空,发现为空就自己创建了Single对象,这时候线程1醒来了,又重现创建了线程,那么线程1和线程2通过Single类得到的对象就不是同一个对象了。
要解决这个问题就要用到线程锁synchronized,代码如下
class Single
{
private static Single s=null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
s=new Single();
}
}
return s;
}
}
Single.class的字节码在内存中只有一份,所以可以作为锁对象来使用,这样就解决了线程安全问题了。