Java单例模式
来源:互联网 发布:免费网页数据采集器 编辑:程序博客网 时间:2024/06/18 16:19
什么是单例模式
单例模式有以下特点:1、只能有一个实例。
2、必须内部创建自己的唯一实例。
3、必须给所有其他对象提供同一个实例。
三个方式
1.饿汉式(推荐使用,Java源码中的的Runtime类就用的这种方式)
/** * 单例模式---饿汉式 * @author Administrator * */public class Singleton {//静态的对象实例private static Singleton instance = new Singleton();//私有的构造方法,防止外部通过new创建对象private Singleton(){}//返回对象实例public static Singleton getInstance(){return instance;}public static void main(String[] args) {Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();System.out.println(s1==s2);}}2.懒汉式
/** * 单例模式---- 懒汉式 * @author Administrator * */public class Singleton {// 静态的对象实例private static Singleton instance = null;// 私有的构造方法,防止外部通过new创建对象private Singleton(){}public static Singleton getInstance() {if(instance == null){instance = new Singleton();}return instance;}public static void main(String[] args) {Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();System.out.println(s1 == s2);}}这个方式有个问题,它适合单线程环境,再多线程环境下会有线程安全问题。
改进方式1:
public synchronized static Singleton getInstance() {if(instance == null){instance = new Singleton();}return instance;}在获取实例的静态方法上加锁,可以避免线程安全问题,但加上同步锁后,性能上有损耗,不建议使用这种方式。
改进方式2:
public static Singleton getInstance(){ if(instance==null){ synchronized(Singleton.class){ if(instance==null){ instance=new Singleton(); } } } return instance;}这种方式加同步锁时,前后两次判断实例是否存在,减少了创建锁的次数,但代码也复杂,比上一个好一些,可行。
3.静态内部类(建议使用)
public class Singleton {private Singleton() {}private static class SingletonHolder {private final static Singleton instance = new Singleton();}public static Singleton getInstance() {return SingletonHolder.instance;}public static void main(String[] args) {Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();System.out.println(s1 == s2);}}这种方式既实现了线程安全,又避免了同步带来的性能影响。
为什么要用单例模式第一、控制资源的使用,通过线程同步来控制资源的并发访问;第二、控制实例产生的数量,达到节约资源的目的。第三、作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。
阅读全文
0 0
- java单例模式
- Java单例模式
- java单例模式
- java单例模式
- Java单例模式
- Java单例模式
- java单例模式
- Java单例模式
- java 单例模式
- java单例模式
- java单例模式
- java单例模式
- java 单例模式
- JAVA单例模式
- java单例模式 .
- Java 单例模式
- Java单例模式
- Java 单例模式
- navigation view 使用
- 微信内置浏览器关闭本窗口
- Linux安装Oracle12C 过程及遇到的问题
- git rm --cache忽略已经提交的文件和如何恢复
- java post json
- Java单例模式
- 关于回调函数和钩子函数基础知识的整理
- python接口自动化5-Json数据处理
- 全文检索之lucene入门
- Arcgis Engine 裁切影像为Tiff总结2
- mysql主从同步(2)-问题梳理
- 16.忽略大小写的字符串比较
- 【结构体】关于结构体,枚举,联合,位段的一些知识
- [BZOJ3053]The Closest M Points(KD-tree+堆)