zoukankan      html  css  js  c++  java
  • 第一讲、单例模式

    1.定义

    单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。

    GOF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局方法。

    2.为什么要使用单例模式?

    在开发中,经常有如下需求:

    • 在多个线程之间,比如servlet环境,共享一个资源或者操作同一个对象。
    • 在整个程序空间使用全局变量,共享资源。
    • 大规模系统中,为了性能考虑,需要节省对象的创建时间等。

    3.单例模式实现

    • 饿汉式
    • 懒汉式
    • 双重检查

    4.代码演示

    /**
     * 饿汉式    (是线程安全的)
     * 
     */
    public class Person {
        private String name;
        //静态常量
        private static final Person per = new Person();
        
        //构造函数私有化
        private Person() {
            
        }
        
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        //提供一个全局的静态方法
        public static Person getPersonInstance() {
            return per;
        }
    }
    package test.com.singleton;
    /**
     * 懒汉式    (线程不安全)
     *
     */
    public class Person2 {
        private String name;
        private static Person2 per;
        
        //构造函数私有化
        private Person2() {
            
        }
        
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        
        //提供一个全局的静态方法
        public static Person2 getPerson2Instance() {
            //因为new也是需要时间的,在多线程的情况下会出现第一个new未执行完,多次new的情况
            if(null == per) {
                per = new Person2();
            }
            return per;
        }
    }
    package test.com.singleton;
    /**
     * 双重检查 (线程安全的)
     *
     */
    public class Person3 {
        private String name;
        private static Person3 per;
        
        //构造函数私有化
        private Person3() {
            
        }
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        
        //提供一个全局的静态方法
        public static Person3 getPerson3Instance() {
            if(null == per) {
                //加锁的意义在于确保第一次new执行完
                synchronized(Person3.class) {
                    if(null == per) {
                        per = new Person3();
                    }
                }
            }
            return per;
        }
        
    }
    package test.com.singleton;
    /**
     * 测试
     *
     */
    public class Main {
        public static void main(String[] args) {
            Person per = Person.getPersonInstance();
            Person per1 = Person.getPersonInstance();
            per.setName("李青");
            per1.setName("李小青");
            System.out.println(per.getName());//李小青
            System.out.println(per1.getName());//李小青
            System.out.println(per == per1);
            
            Person2 per3 = Person2.getPerson2Instance();
            Person2 per4 = Person2.getPerson2Instance();
            per.setName("赵青");
            per1.setName("赵小青");
            System.out.println(per.getName());//赵小青
            System.out.println(per1.getName());//赵小青
            System.out.println(per3 == per4);
        }
    }

     5.相关文章

    noteless

  • 相关阅读:
    Ant-编译构建(2)-第3方jar包引入、log4j2
    Ant-编译构建(1)-HelloWorld
    java List的初始化
    传入json字符串的post请求
    HttPclient 以post方式发送json
    cron表达式详解,cron表达式写法,cron表达式例子
    深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
    Java两种延时——thread和timer
    List<List<Object>> list = new ArrayList<List<Object>>(); 求回答补充问题 list.get(position).add(Object);为什么会报错啊我想在对应的list里面添加对象
    关于 charset 的几种编码方式
  • 原文地址:https://www.cnblogs.com/zheaven/p/9881448.html
Copyright © 2011-2022 走看看