• 单例设计模式


    单例是为了解决全局只有一个实例这样的问题.

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    02_饿汉式单例

    HungrySingleton.java
    package com.qianfeng.singleton;

    import java.nio.file.attribute.UserDefinedFileAttributeView;

    /**
    * 饿汉式单例:因为类每次加载到内存的时候,就把这个实例instance就实例化好了
    * instance是个静态的,他的创建是发生在类第一次加载到内存的时候.
    * 有可能出现这种情况.我现在暂时不需要User对象,我只是想用一下User类里面的静态方法,
    * 但是这时发现instance已经实例化好了,
    * 所以造成了不必要的性能损耗
    * 也造成了不必要的空间损耗
    */
    public class HungrySingleton {
    public static void main(String[] args) {
    //通过单例类中指定的方法,进行对象的获取
    //不能用new User();这种方式来获取类对象
    User user=User.getUser();

    /**
    *测试是否是全局唯一
    */
    for (int i=0;i<1000;i++){
    User u = User.getUser();
    if(user!=u){//比较的是地址
    System.out.println("一个新的对象被实例化了");
    }
    }
    System.out.println("程序结束");
    }
    }

    /**
    * 作为一个单例类,有且只能有一个实例
    */
    class User{
    //1.私有化构造方法
    private User(){}

    //2.设计一个私有的静态的当前类对象
    //方式一
    //设计instance为private的目的,防止外界直接通过User.instance=null;直接修改类对象
    private static User instance=new User();
    //方式二
    /*
    * static{
    * instance=new User();
    * }
    * */

    //3.提供一个方法,可以返回给调用方一个当前类对象
    public static User getUser(){

    return instance;
    }
    }


    }

     ==============================================================================================================================================================

    03_懒汉式单例

    LazySigleton.java
    package com.qianfeng.singleton;

    public class LazySigleton {
    public static void main(String[] args) {

    for (int i=0;i<1000;i++){
    Teacher.getTeacher();
    }
    }
    }

    class Teacher{
    //1.构造方法私有化
    private Teacher(){
    System.out.println("一个新的Teacher对象被实例化了");
    }

    //2.没有直接实例化
    private static Teacher instance;

    //3.提供静态的,获取当前类对象的方法
    public static Teacher getTeacher(){
    //懒汉式,判断对象如果为空,才去创建对象
    //懒汉式对空间的占用,优于饿汉式
    if(instance==null){
    instance=new Teacher();
    }
    return instance;
    }
    }

     =======================================================================================================================================

    04_懒汉式模式多线程问题

    MoreThreadSingleton.java
    package com.qianfeng.singleton;

    public class MoreThreadSingleton {
    public static void main(String[] args) {

    for (int i=0;i<1000;i++){
    Thread thread = new Thread(()->{
    Chairman.getInstance();
    });
    thread.start();
    }
    }
    }
    class Chairman{
    private Chairman(){
    System.out.println("一个新的对象被实例化了");
    }

    private static Chairman instance;

    public static Chairman getInstance(){
    if (instance==null){
    instance=new Chairman();
    }
    return instance;
    }

    }

     解决方法:

  • 相关阅读:
    java基础(二):补充
    java基础(二):变量和数据类型
    C基础系列(一)
    java基础(一)
    循环小数(Repeating Decimals)
    DNA序列(DNA Consensus String)
    sqlserver~创建函数
    docker简介和安装
    JMeter(6)、实现Java请求
    JMeter(5)、测试数据库
  • 原文地址:https://www.cnblogs.com/curedfisher/p/12667378.html
Copyright © 2020-2023  润新知