java 单例模式
来源:互联网 发布:shell curl post json 编辑:程序博客网 时间:2024/05/16 07:14
单例模式:确保一类最多只有一个实例,并提供一个全局访问点
列如:一个打印文件的类B, A类实例化B需要打印文件,C类实例化B需要打印文件,这样就会造成打印后的文件有A的东西还有C的东西;
实现方法: 1.用静态变量方式来实现 2. 程序员之间协商个全局变量
//打印文件类public class Singleton { //静态变量 private static Singleton uniquInstance=null; private Singleton(){ } // 在本身类中实例化自己 如果A类第一次调用此方法 就先实例化 下次B调用此方法的时候直接返回A实例化uniquInstance 避免重复new 对象public static Singleton getInstance(){ if(uniquInstance==null){ uniquInstance=new Singleton(); } return uniquInstance;}}
- 经典单例模式的优化
- 经典单例模式存在的多线程问题,并给出3种优化方案。
由于多线程执行是根据时间片的 如果A类调用getInstance()方法执行里面if(uniquInstance==null){方法的时候,系统把时间片给了B 那B类调用getInstance()方法执行里面if(uniquInstance==null){方法的时候就会new一个Singleton,然后A类执行的时候也new一个Singleton,这样就造成bug,
1.解决办法是给getInstance方法加一个同步锁synchronized
//打印文件类public class Singleton { //静态变量 private static Singleton uniquInstance=null; private Singleton(){ }//解决办法是给getInstance方法加一个同步锁synchronized public static synchronized Singleton getInstance(){ if(uniquInstance==null){ uniquInstance=new Singleton(); } return uniquInstance;}}
2.直接一开始就实例化自己
不管那个线程调用getInstance 都是直接返回uniquInstance
//打印文件类public class Singleton { //直接一开始就实例化自己 private static Singleton uniquInstance=new Singleton; private Singleton(){ }//不管那个线程调用此方法 都是直接返回uniquInstancepublic static Singleton getInstance(){ if(uniquInstance==null){ uniquInstance=new Singleton(); } return uniquInstance;}}
- 3.
- 这个就跟第一个方法差不多,不过比第一个更加节约消耗,synchronized 会造成消耗,这样加synchronized 的话就只会第一次new Singleton 的时候会用到同步锁,所以减少消耗。 第一个方法是没次调用getInstance的时候都会用到同步锁,如果线程多的话就会造成没必要的消耗
//打印文件类public class Singleton { //静态变量 private static Singleton uniquInstance=null; private Singleton(){ }public static Singleton getInstance(){ if(uniquInstance==null){ synchronized(Singleton.class){ if(uniquInstance==null){ uniquInstance=new Singleton(); } } } return uniquInstance;}}
0 0
- java单例模式
- Java单例模式
- java单例模式
- java单例模式
- Java单例模式
- Java单例模式
- java单例模式
- Java单例模式
- java 单例模式
- java单例模式
- java单例模式
- java单例模式
- java 单例模式
- JAVA单例模式
- java单例模式 .
- Java 单例模式
- Java单例模式
- Java 单例模式
- Bootstrap Input file 上传文件大小限制设定
- [swift学习之十二]二维码创建练习
- 浅谈Java代理机制
- 《深入理解mybatis原理(二)》 Mybatis关联查询问题
- 1、Lambda
- java 单例模式
- 动态存储分配及深复制 —字符串的复制2
- C# 对象序列化与反序列化
- where in 和where=
- 环信自学 实现通话功能心得—Eclipse篇
- 代码取得storyboard中的viewcontroller
- 10 11周 补充 项目二(1)
- openerp odoo 直接操作数据库的示例
- hdu 1166 敌兵布阵