懒汉式和饿汉式
2018-03-24 14:55
106 查看
饿汉式
方式一:不加锁的,所以线程不安全
//因为不想被创建对象,所以必须构造方法私有化,如果不写也会有默认的构造方法,所以必须写私有的
private LazySingle() {
}
//延时创建
private static LazySingle ls = null;
//加锁是为了保证线程的安全防止创建多个对象
public static LazySingle getLazySingle() {
if (ls == null) {
synchronized (LazySingle.class) {
if (ls == null) {
ls = new LazySingle();
}
}
}
return ls;
}
}
方法二中,我们能够看出锁也可以加在public static LazySingle getLazySingle() {}中,但是如果加在方法中那么每次调用都会判断锁的归属权,尤其在循环中,很影响效率,所以要加在第二个if外面。
public class LazySingle { //因为不想被创建对象,所以必须构造方法私有化,如果不写也会有默认的构造方法,所以必须写私有的 private LazySingle() { } //延时创建 private static LazySingle ls = null; //加锁是为了保证线程的安全防止创建多个对象 public static LazySingle getLazySingle() { if (ls == null) { ls = new LazySingle(); } return ls; } }懒汉式
方式一:不加锁的,所以线程不安全
public class HungrySingle { private static final HungrySingle hs = new HungrySingle(); //因为不想被创建对象,所以必须构造方法私有化,如果不写也会有默认的构造方法,所以必须写私有的 private HungrySingle(){} public static HungrySingle getHs() { return hs; } }方式二:加锁,保证线程安全public class LazySingle {
//因为不想被创建对象,所以必须构造方法私有化,如果不写也会有默认的构造方法,所以必须写私有的
private LazySingle() {
}
//延时创建
private static LazySingle ls = null;
//加锁是为了保证线程的安全防止创建多个对象
public static LazySingle getLazySingle() {
if (ls == null) {
synchronized (LazySingle.class) {
if (ls == null) {
ls = new LazySingle();
}
}
}
return ls;
}
}
方法二中,我们能够看出锁也可以加在public static LazySingle getLazySingle() {}中,但是如果加在方法中那么每次调用都会判断锁的归属权,尤其在循环中,很影响效率,所以要加在第二个if外面。
相关文章推荐
- 单例饿汉式与懒汉式的区别
- 设计模式--单例模式(一)懒汉式和饿汉式
- 饿汉式,懒汉式
- 线程简介--单利模式饿汉式和懒汉式
- 单例模式(饿汉式与懒汉式)
- 设计模式——懒汉式单例类PK饿汉式单例类
- 单例模式的懒汉式和饿汉式实现分析
- Java单例模式--饿汉式、懒汉式需要怎么写
- 理解单例设计模式(饿汉式,懒汉式,静态内部类,枚举,双重校验锁)
- 工厂模式(懒汉式、饿汉式)
- Java设计模式——单例模式(饿汉式、懒汉式)
- 懒汉式与饿汉式
- [设计模式]单例模式(懒汉式和饿汉式)
- 单例设计模式(懒汉式,饿汉式,枚举式,双重检测锁式,静态内部类式)
- 单例模式Singleton(饿汉式和懒汉式)
- java基础10 单例模式之饿汉式和懒汉式单例
- 单例模式(饿汉式与懒汉式)
- 例模式:饿汉式,懒汉式+工厂模式
- 饿汉式与懒汉式的区别
- (6) Java多线程 线程状态等相关知识(含单例懒汉式饿汉式)