【寻找自己】单例模式
话说快到年底了,对于离职这件事我也把自己逼到墙角了,当初先奏后斩的做法导致我还没有想好未来的东家是谁。
在X公司折腾了半年多,当初不顾一切的杀个回马枪,现在又不顾一切的离他而去。总结几句话,算是在这个公司所有收获:
- 有人的地方就有江湖,为人处世很重要。
- 安逸是留给死人的,做开发这行安逸就等于落后,逆水行舟不进则退,So以后要注重个人的知识培养
- 人区别动物的最根本特点就是“工具”,高级开发和普通开发的区别也是“工具”,业务报警分析、性能报警分析、系统报警分析凡事用工具可以提高故障排查、故障报警的事情都应该去做。工具--------就是垂直贯穿业务的应用系统
好了,切入正题。前几天看了下Java的设计模式,说实话没有看完,有23种好像,我总结下来就是通过接口、抽象类、组合(引用对象)实现继承与解耦。正好昨天被媳妇到PHP调用rabbitmq,有个类是不是要写成单例的,于是乎自己自己考虑了下,有了如下结论:
- 单例优点:减少对象创建的数量,优化内存使用。spring管理的bean默认都是单例的(我的bean都不提供单例的方法,spring如何保障单例?所以也只是在spring的上下文中单例而已)
- 单例缺点:实现单例必须要考虑并发问题(多线程)。一个类能不能写成单例的,最根本的问题是这个类是不是线程安全的。当一个类被单例之后,你可以认为这个类只存在一个对象,那么对象包含啥?属性、方法。所以一个类是不是线程安全的就得看这个类的方法、属性是不是线程安全的。比如:
public class DBUtils{ private static DBUtils dbUtils = null; private Connection connect=null;//connection非线程安全 private DBUtils(){}//私有构造,禁止直接new private DBUtils getInstance(){ //...单例实现 } public void execute(Sting sql){ try{ connection = 获取连接; //执行SQL }catch(Exception e){ //处理异常 }finally{ //关闭连接 } } }
PS :由于connection非线程安全,所以这个对象如果使用单例会有并发问题。解决方案:1、connection 对象放到方法里边:Connection connect = 获取连接;2、用 threadlocal修饰
- 单例实现:网上多的是,有以下几个重点:
- 私有构造:因为只能通过静态方法获取类实例,所以不允许直接new
- 如果为第一次获取对象时实例化(懒汉模式),则需要考虑线程同步问题,synchrize、lock等()

浙公网安备 33010602011771号