单例模式(Singleton)的同步锁synchronized
来源:互联网 发布:经典球员数据盖德穆勒 编辑:程序博客网 时间:2024/06/05 09:20
单例模式,有“懒汉式”和“饿汉式”两种。
懒汉式
单例类的实例在第一次被引用时候才被初始化。
public class Singleton { private static Singleton instance=null; private Singleton() { } public static Singleton getInstance(){ if (instance == null) { instance = new Singleton(); } return instance; } }
饿汉式
单例类的实例在加载的时候就被初始化。
public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance(){ return instance; } }
在单线程程序中,上面两种形式基本可以满足要求了,但是在多线程环境下,单例类就有可能会失效,这个时候就要对其加锁了,来确保线程安全。
对线程加锁用的synchronized关键字,这个关键字的用法主要也分为两种:
一种是加在方法名之前,形如:synchronized methodeName(params){……};
二是声明同步块,形如:synchronized(this){……};
下面是对懒汉式单例类加上线程同步的实现:
同步方法:
public class Singleton { private static Singleton instance=null; private Singleton() { } public synchronized static Singleton getInstance(){ if (instance == null) { instance = new Singleton(); } return instance; } }
public class Singleton { private static Singleton instance=null; private Singleton() { } public synchronized static Singleton getInstance(){ if (instance == null) { instance = new Singleton(); } return instance; } }
这种方式效率比较低,性能不是太好,不过也可以用,因为是对整个方法加上了线程同步,其实只要在new的时候考虑线程同步就行了,这种方法不推荐使用。
同步代码块:
public class Singleton { private static Singleton instance; private final static Object syncLock = new Object(); private Singleton() { } public static Singleton getInstance(){ if (instance == null) { synchronized (syncLock) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
synchronized同步块括号中的锁定对象是采用的一个无关的Object类实例,而不是采用this,因为getInstance是一个静态方法,在它内部不能使用未静态的或者未实例的类对象,因此也可以用下面的方法来实现:
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; } }
同步代码块的这两种方式都是比较推荐使用的,我就一直在项目中使用,有问题以后可以再改进。
阅读全文
0 0
- 单例模式(Singleton)的同步锁synchronized
- 单例模式(Singleton)的同步锁synchronized
- 单例模式的讲解(singleton)
- 单例模式(Singleton)的创建
- iOS的单例模式(singleton)
- iOS的单例模式(singleton)
- iOS的单例模式(singleton)
- 单例模式(Singleton)的创建
- synchronized 在单例singleton模式中的应用
- 单例模式(singleton)
- 单例(Singleton)模式
- 单例模式(Singleton)
- 单例模式(Singleton)
- Singleton(单例)模式
- 单例模式(Singleton)
- 单例模式(Singleton)
- 单例模式(Singleton)
- 单例模式(singleton)
- Hibernate Ⅱ Log4j Juit
- 有用的博客的链接
- nutch2.3分布式搭建
- flex:多栏多列弹性布局
- 同源策略与跨域
- 单例模式(Singleton)的同步锁synchronized
- H
- 华硕ASUS台式主板 改WIN7 BIOS 设置详解
- hadoop内存不足
- websocket聊天室
- Android中ViewPager常用功能3----仿微信既能点击又能滑动的选项卡
- PAT 1058选择题
- 天天编码java学习网站
- 安卓java 代码中动态实现 TextView的 DrawableTop属性