[b][align=center][size=large]单例模式[/size][/align][/b]
[b][size=medium]1.1饿汉式[/size][/b]
/**
* 单例
*
* @author lzk
*
*/
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton GetInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
总结:利用双重锁的方式这样颗粒度变小了,但还是利用同步的方式来解决资源共享问题。
不采取任何措施造成的线程不安全问题,是因为在程序中出现了“竞态条件”,由于不恰当的执行时序而出现不正确的结果。最常见的竞态条件类型就是“先检查后执行”操作,即通过一个可能失效的观测结果来决定下一步的动作。
[b][size=medium]1.2饱汉式[/size][/b]
/**
* 单例
*
* @author lzk
*
*/
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton GetInstance() {
return instance;
}
}
总结:不利用线程同步的方式,而是在类被加载的时候就生成一个实例对象。这个带来的问题就是,不管这个单例有没有用到都会一直存在。
[b][size=medium]1.1饿汉式[/size][/b]
/**
* 单例
*
* @author lzk
*
*/
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton GetInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
总结:利用双重锁的方式这样颗粒度变小了,但还是利用同步的方式来解决资源共享问题。
不采取任何措施造成的线程不安全问题,是因为在程序中出现了“竞态条件”,由于不恰当的执行时序而出现不正确的结果。最常见的竞态条件类型就是“先检查后执行”操作,即通过一个可能失效的观测结果来决定下一步的动作。
[b][size=medium]1.2饱汉式[/size][/b]
/**
* 单例
*
* @author lzk
*
*/
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton GetInstance() {
return instance;
}
}
总结:不利用线程同步的方式,而是在类被加载的时候就生成一个实例对象。这个带来的问题就是,不管这个单例有没有用到都会一直存在。