zoukankan      html  css  js  c++  java
  • 设计模式-单例模式

    单例模式(Singleton pattern) 是一种常见的设计模式,常见的有两种写法:饿汉式单例、懒汉式单例。

    单例模式定义

    确保一个类只有一个实例,并提供一个全局访问点。

    饿汉式单例

    饿汉式单例,构造方法私有化,类加载的同时创建实例,代码如下:

     1 public class MyClass {
     2     
     3     private static MyClass instance = new MyClass();
     4 
     5     private MyClass() {}
     6 
     7     public static MyClass getInstance() {
     8         return instance;
     9     }
    10 
    11     // 测试
    12     public static void main(String[] args) {
    13         MyClass m1 = MyClass.getInstance();
    14         MyClass m2 = MyClass.getInstance();
    15         System.out.println(m1 == m2);
    16     }
    17 }
    18 
    19 // 输出结果:
    20 // true

    懒汉式单例

    懒汉式单例同样将构造方法私有化,只是在第一次调用类的时候才创建实例,代码:

     1 public class MyClass {
     2     
     3     private static MyClass instance;
     4 
     5     private MyClass() {}
     6 
     7     public static MyClass getInstance() {
     8         if(instance == null) {
     9             instance = new MyClass();
    10         }
    11         return instance;
    12     }
    13 }

    懒汉式单例有个问题,就是多线程并发访问时,可能会出错,创建出多个实例对象;当然,我可以用“synchronized”关键字修饰 getInstance方法,强制每个线程进入这个方法之前,要先等别的线程离开该方法,确保不出错;但是,这会降低性能,而且,只有第一次执行该方法时 才需要同步;所以在使用时,如果确实有高并发的情况,建议用饿汉式编写代码。也可以用双重检查加锁的方式,首先检查是不是已经创建了实例,如果未创建,再 进行同步。代码:

    public class MyClass {
        
        private volatile static MyClass instance;
    
        private MyClass() {}
        
        public static MyClass getInstance() {
            if(instance == null) {
                synchronized (MyClass.class) {
                    if(instance == null) {
                        instance = new MyClass();
                    }
                }
            }
            return instance;
        }
    }
  • 相关阅读:
    hibernate的缓存机制
    [poj 3159]Candies[差分约束详解][朴素的考虑法]
    POJ 2773 Happy 2006
    给定一个循环链表,实现一个算法返回这个环的开始结点
    使用jQuery创建模态窗口登陆效果
    实战数据结构(3)_两个单链表间的合并操作
    sql的强大功能(看一条sql解决的复杂业务)
    uva 10905 Children's Game (排序)
    JFinal学习 & Gradle配置续 & Tomcat配置
    Gradle项目学习 & HttpAsyncClient学习 & CountDownLatch学习
  • 原文地址:https://www.cnblogs.com/LikeStar/p/5655758.html
Copyright © 2011-2022 走看看