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;
        }
    }
  • 相关阅读:
    前沿技术解密——VirtualDOM
    Ques核心思想——CSS Namespace
    Unix Pipes to Javascript Pipes
    Road to the future——伪MVVM库Q.js
    聊聊CSS postproccessors
    【译】十款性能最佳的压缩算法
    Kafka Streams开发入门(9)
    Kafka Streams开发入门(8)
    【译】Kafka Producer Sticky Partitioner
    【译】99th Percentile Latency at Scale with Apache Kafka
  • 原文地址:https://www.cnblogs.com/LikeStar/p/5655758.html
Copyright © 2011-2022 走看看