• java设计模式--单例模式


    1 static 静态域与静态方法

    java单例模式介绍之前,先介绍一下静态域和静态方法,在单例设计模式中需要用到。先看下面的类:

    class demo{
    	private static int nextId = 1;
    	private int id;
    }
    

    其中,nextId是静态类型,id不是,那么说明demo每创建一次对象,都会分配一个域给id,每个对象都不一样,但是不管demo创建多少个对象,nextId只有一个域,每个对象共享。id的域称为实例域,nextId的域称为静态域。静态域属于类,不属于任何对象,所以不管是静态常量、静态变量和静态函数都是通过类名直接访问,而一般不会用对象去访问,虽然对象也可以访问,但是容易出麻烦。示意图如下:

    2 饿汉单例设计模式

    步骤:

    1、私有化构造函数,防止别人new对象。

    2、声明本类的引用类型变量,并使用该变量指向本类的对象。

    3、提供一个公共的静态方法获取本类的对象。

    实例如下:

    public class designmodel {
    	public static void main(String[] args) {
    		single s1 = single.getInstance();
    		single s2 = single.getInstance();
    		System.out.println("s1和s2是同一个对象吗? " + (s1==s2));
    	}
    }
    
    class single{
    	private single(){}
    	private static single s = new single();
    	public static single getInstance(){
    		return s;
    	}
    }
    

    输出结果是true

    3 懒汉单例设计模式

    在饿汉单例设计模式中,每一次执行getInstance都会产生一个single对象,这样会产生大量垃圾对象,所以为了提高效率,设计了懒汉单例设计模式

    ps:但是懒汉单例设计模式是线程不安全的

    步骤:

    1、私有化构造函数,防止别人new对象。

    2、声明本类的引用类型变量,但不创建类对象。

    3、提供一个公共的静态方法,先检测对象是否被创建了,若创建了直接返回该对象,否则,创建一个对象返回。

    实例如下:

    public class designmodel {
    	public static void main(String[] args) {
    		single s1 = single.getInstance();
    		single s2 = single.getInstance();
    		System.out.println("s1和s2是同一个对象吗? " + (s1==s2));
    	}
    }
    
    class single{
    	private single(){}
    	private static single s;
    	public static single getInstance(){
    		if(s==null){
    			s = new single();
    		}
    		return s;
    	}
    }
    

    但是这种方式会产生线程安全问题,不同线程同时执行到if(s==null)时候,可能会创建多余的single对象。

    解决方法:通过线程的知识,要加线程锁才能解决线程安全问题,那么解决办法就简单了,只需要给getInstance函数加一个synchronized线程锁:

    public class designmodel {
    	public static void main(String[] args) {
    		single s1 = single.getInstance();
    		single s2 = single.getInstance();
    		System.out.println("s1和s2是同一个对象吗? " + (s1==s2));
    	}
    }
    
    class single{
    	private single(){}
    	private static single s;
    	public static synchronized single getInstance(){
    		if(s==null){
    			s = new single();
    		}
    		return s;
    	}
    }
    

    ok!完美ending!

  • 相关阅读:
    MySQL 8 新特性之Clone Plugin
    哈尔滨工业大学(威海)第九届ACM程序设计竞赛
    我回来了
    正则表达式(五):正则表达式的高阶使用
    正则表达式(四):正则表达式中的分组的概念
    正则表达式(三):正则表达式中的重复
    正则表达式(二):正则表达式的元字符
    正则表达式(一):正则表达式的概念
    Android NDK 跨平台构建工具 CMake 使用笔记
    字节序问题之大小端模式讲解
  • 原文地址:https://www.cnblogs.com/K-artorias/p/7839892.html
Copyright © 2020-2023  润新知