Java设计模式1-单例设计模式
来源:互联网 发布:手机安装软件代理 编辑:程序博客网 时间:2024/06/05 14:39
1、为什么设计成单例模式?
保证类在内存中只有一个对象。例如:(Runtime类)。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。
2、单例模式设计的3种方式:
1、饿汉式(推荐使用)
public class Singleton { // 1,私有构造函数,不能创建对象 private Singleton() { } // 2,创建本类对象,定义static是为了可以使用 类名.方法 调用,定义private是为了不让其他类访问修改。 private static Singleton s = new Singleton(); // 3,对外提供公共的访问方法,定义static可以使用 类名.方法 调用,定义public为了让其他类调用。 public static Singleton getInstance() { return s;// 返回这个对象 } public static void print() { System.out.println("abc"); } } 注意:饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。
2、懒汉式(存在多线程访问问题,不建议使用)
public class Singleton { //1,私有构造函数,不能创建对象 private Singleton(){} //2,创建本类对象,定义static是为了可以使用 类名.方法 调用,定义private是为了不让其他类访问修改。 private static Singleton s = null; //3,调用的时候判断。 public static Singleton getInstance() { if(s == null){ //可能存在 线程1,线程2 同时创建的问题 s = new Singleton(); } return s; } public static void print() { System.out.println("abc"); } }
注意:如果你想使用饿汉式,又想线程同步,可以加上同步锁。 例如:
//在方法上加同步锁 public static synchronized Singleton getInstance() { if(s == null){ s = new Singleton(); } return s; } //或者,这样双重检查锁定 public static Singleton getInstance() { //先检查实例是否存在,如果不存在才进入下面的同步块 if(s == null){ //同步块,线程安全的创建实例 synchronized (Singleton.class) { //再次检查实例是否存在,如果不存在才真正的创建实例 if(s == null){ s = new Singleton(); } } } return s; }
3、使用final修饰
class Singleton { private Singleton() {} //final是最终的意思,被final修饰的变量不可以被更改 public static final Singleton s = new Singleton(); } 备注:其实这种方式和饿汉式类似,都是开始就创建了一个对象实例
3、饿汉式和懒汉式区别:
饿汉式优点: 天生就是线程安全的 在第一次调用时速度也会更快,因为其资源已经初始化完成饿汉式缺点: 会占据一定的内存懒汉式优点: 会节省一点内存懒汉式缺点: 线程不安全,如果加同步syncronized的也会影响性能 第一次使用的时候才new,会出现一些加载延迟,特别是需要加载的资源比较多的时候
阅读全文
0 0
- Java设计模式-1-单例模式
- java设计模式(1) - 单例模式
- java设计模式1 单例模式
- Java设计模式(1)单例模式
- Java设计模式(1) 单例模式
- JAVA设计模式(1)----单例模式
- java 设计模式,单例设计模式
- java设计模式-单例设计模式
- java设计模式-单例设计模式
- Java设计模式 单例设计模式
- Java设计模式------单例设计模式
- java设计模式----->单例设计模式
- java设计模式:单例设计模式
- java设计模式-----单例设计模式
- Java设计模式----单例设计模式
- java设计模式-单例设计模式
- java设计模式:单例设计模式
- java 设计模式-单例设计模式
- ply格式转换成点云pcd格式
- 关于公钥私钥证书的理解
- 密码学复习笔记4【公钥密码技术、RSA 、ElGamal】
- CentOs 7下安装Tomcat 8
- webpack 1X 环境配置
- Java设计模式1-单例设计模式
- Android百度地图开发定位和路线导航
- 多线程
- 字符版本贪吃蛇游戏设计
- 219. Contains Duplicate II
- tf.stack和tf.unstack
- 会结账的服务器
- 公司主体价值的缺失与社会经济反弹乏力
- K3 LEDE踩坑专题