------- android培训、java培训、期待与您交流! ----------
一.单例模式中的线程安全问题。
1.什么是单例模式:
为节约系统资源。使系统中一个类只有一个实例对象(实现方法:构造函数私有化,对外提供获得实例的静态方法,该静态方法始终返回同一个实例对象)。
2.单例模式的分类:
饿汉式(没有线程安全问题)。
懒汉式(有线程安全问题)。
饿汉式单例模式示例代码:
class HungrySingle{
//在类中一个创建该类的对象
private static HungrySingle s = new HungrySingle();
//构造函数私有化,使外界不能通过调用构造函数来创建对象。
private Single();
//提供静态方法,是外界能够获得同一个对象。
public static Single getInstance(){
return s ;
}
}
懒汉式单例模式示例代码:
class LazySingle{
//在类中一个该类的引用类型的变量
private static LazySingle s = null;
//构造函数私有化,使外界不能通过调用构造函数来创建对象。
private LazySingle();
//提供静态方法,是外界能够获得同一个对象。
public static void LazySingle getInstance(){
if(s==null){ s = new Single}
else{return s}
}
}
3.懒汉式单例模式多线程安全问题
当多个线程并发访问getInstance(),可能会产生线程安全问题,使一个类有多个对象。
解决方法:将可能引发线程安全问题的代码,放入synchronized(Object o)代码块中。
示例代码:
class LazySingle{
//在类中一个该类的引用类型的变量
private static LazySingle s = null;
//构造函数私有化,使外界不能通过调用构造函数来创建对象。
private LazySingle();
//提供静态方法,是外界能够获得同一个对象。
public static void LazySingle getInstance(){
//使用if语句过滤synchronized代码块的执行,降低资源消耗
if(s==null){
//静态方法中使用LazySingle.class方法传递对象。
synchronized(LazySingle.class){
if(s==null)
{ s = new Single}
}
else{return s}
}
}
}