Java设计模式之单例与双重锁定
2015-06-06 16:38
423 查看
有时候我们需要使用某些工具类,但是每次都要调用new,不但麻烦而且耗内存。那么我们怎么样优化一下呢?
在java设计模式之中有一种设计模式叫做单例,顾名思义就是只有一个实例。
那么我们往下看到底怎么样才可以做到单例呢?
首先要把工具类的构造方法定为私有,并且只能通过get方法得到此类的实例,而且要把此get方法定为静态,不然就没意思啦
看~这么一改调用起来就方便多了只需要调用Util.getInstance();就可以得到实例了,然后通过此实例就可以调用方法printLog()。既方便又节约内存。
但是这样写只合适单线程使用,如果在多线程的情况下就有可能会重复new几个Util对象了,那么我们接下来就对Util类改造。
怎么改呢?我们使用双重锁定:
通过双重判断使得只有util为空的时候才去new一个对象,而且用synchronized 锁住了new的方法使得只有一个线程可以调用new方法。
以上代码都是笔者直接在博客上写没有通过编译器测试~所以有时候会写错字母或者少写了个括号~
在java设计模式之中有一种设计模式叫做单例,顾名思义就是只有一个实例。
那么我们往下看到底怎么样才可以做到单例呢?
首先要把工具类的构造方法定为私有,并且只能通过get方法得到此类的实例,而且要把此get方法定为静态,不然就没意思啦
public class Util{ private static Util util; private Util(){ } public static Util getInstance(){ if(util==null){ util=new Util(); } return util; } public void printLog(String msg){ Log.i(msg); } }
看~这么一改调用起来就方便多了只需要调用Util.getInstance();就可以得到实例了,然后通过此实例就可以调用方法printLog()。既方便又节约内存。
但是这样写只合适单线程使用,如果在多线程的情况下就有可能会重复new几个Util对象了,那么我们接下来就对Util类改造。
怎么改呢?我们使用双重锁定:
public class Util{ private static Util util; private Util(){ } public static Util getInstance(){ if(util==null){ synchronized (Util.class){ if(util==null){ util=new Util(); } } } return util; } public void printLog(String msg){ Log.i(msg); }<span style="font-family: 微软雅黑;">}</span>
通过双重判断使得只有util为空的时候才去new一个对象,而且用synchronized 锁住了new的方法使得只有一个线程可以调用new方法。
以上代码都是笔者直接在博客上写没有通过编译器测试~所以有时候会写错字母或者少写了个括号~
相关文章推荐
- 算法编程(JAVA)--八皇后问题
- java学习【课后笔记】
- 【Thinking in Java笔记】Java环境变量CLASSPATH
- leetcode--Rotate Image
- 探讨深入Java虚拟机之内存优化
- Ubuntu java 环境变量
- java PO BO VO DTO POJO DAO概念及其作用(附转换图)
- 【课堂程序整理】身份证效验码
- 探讨Java虚拟机之虚拟机体系结构
- Eclipse NDK 编译报错:Cannot run program "sh":
- Java 文件操作
- Comparable vs. Comparator in Java
- 一个Java编写的小玩意儿--脚本语言解释器(一)
- Eclipse Indigo 3.7 中文字体偏小解决方案: Consolas 微软雅黑混合字体!
- Read doc file in java using poi
- Create Excel file in java using PoI
- 【课堂程序整理】字符统计
- java I/O底层是如何工作的?
- How to use java annotation at runtime
- (一)spring MVC基本概念和流程