• Static 单例模式


    Static 方法的问题

    今天在看EhCache源码的时候,发现有一个这样的方法

     

    这个是个典型的单例模式的工具类,但我所知道的单例模式的写法不是这样的,虽然《effect java》中推荐的方法是用枚举,static方法类似于枚举方法,但觉得这种单例模式确实值得学习学习。

     

    看我的测试结果:

    总共两个类

    /**

    * 测试单例类

    * @author wu

    *

    */

    public class StaticClass {

        

        public static Integer id = 0;

        

        private StaticClass(){

            

        }

        

        public static void sysInfo(){

            System.out.println("this is " + id);

            id++;

        }

    }

     

     

     

    第二个类

    package com.test;

     

    /**

    * 测试类

    * @author wu

    *

    */

    public class TestMain {

     

        public static void main(String[] args) {

            test();

        }

        

        /**

         * 调用3次数,输出结果

         */

        public static void test(){

            for (int i = 0; i < 3; i++) {

                StaticClass.sysInfo();

            }

        }

     

        /**

         * 多线程调用

         */

        public static void runIt(){

            for (int i = 0; i < 4; i++) {

                new Thread(new Runnable() {

                    @Override

                    public void run() {

                        StaticClass.sysInfo();

                    }

                }).start();

            }

        }

    }

     

    第一次测试结果:

    this is 0

    this is 1

    this is 2

     

    这个结果证明每调用static方法,都不会产生新的实例,所以,符合单例模式的需求。是不是这样就可以直接说这个是单例模式了?

    再看下面的多线程测试结果:

    this is 0

    this is 0

    this is 0

    this is 0

     

    这个结果产生的是4个不同的实例,所以上面的方法在多线程情况下是结果是不对的,不符合单例模式的需求。但有没有办法解决这种情况了?

    答案是有的,多线程模式事以同步,加个关键字

    public synchronized static void sysInfo(){

            System.out.println("this is " + id);

            id++;

        }

    测试结果:

     

    this is 0

    this is 1

    this is 2

    this is 3

     

    这样在多线程环境下也可以实现单例模式,这个方法确实比以前的单例模式好的地方,就是不需要在私有构造器中创建对象。也不需要担心多线程情况下出现其他错误情况!

  • 相关阅读:
    文档生成器
    jenkins多分支版本备份
    jenkins发布控制版本号和同步
    py导出时段报表
    jenkins多分支回滚总结文
    jenkins单分支版本备份
    k8s多pod查询日志脚本
    php 0425
    php 0418
    php 0422
  • 原文地址:https://www.cnblogs.com/wxwall/p/3445380.html
Copyright © 2020-2023  润新知