zoukankan      html  css  js  c++  java
  • 一个非常简单的限定对象数量的方法

    有时在工作,可能会出现一些情况,我们不适合使用单例模式,但是又不允许无限制的new同一个对象;

    我的思路是设置一个当前对象数量,每创建一个对象则+1,一个对象被回收则-1;大于最大数量则不允许创建对象;方法很简单;

    下面是试例代码:

    package test;
    
    import java.lang.reflect.InvocationTargetException;
    
    public class TestStatic {
    
        public static void main(String[] args) throws Exception {
            for (int i = 0; i < 150; i++) {
                Thread t = new Factory("name" + i);
                t.start();
            }
        }
    
    }
    
    class Factory extends Thread{
        Test test;
        public Factory(String name) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException{
            this.test = Test.getInstance(name);
            //this.test =  (Test) Class.forName("test.Test").getConstructor(new Class[]{String.class}).newInstance(new Object[]{name});
        }
        public void run(){
            test.doSomething();
            test = null;
        }
    }
    
    
    class Test {
        String name;
        public static int count = 0;
        private static int maxNum = 100;
    
        public Test(String name) {
            count++;
            System.out.println(name + " is new");
            this.name = name;
        }
    
        public static Test getInstance(String name) {
            while (true) {
                if (Test.maxNum > count) {
                    return new Test(name);
                } else {
                    count++;
                    if (count == 1000) {
                        count = 0;
                        System.out.println("recycle");
                    }
                    System.gc();
                }
            }
        }
    
        public void doSomething() {
            try {
                System.out.println(name + "start doSomething");
                Thread.sleep(5000);
                System.out.println(name + "complete doSomething");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        @Override
        protected void finalize() throws Throwable {
            super.finalize();
            System.out.println(this.name + "is destroyed");
            count--;
    
        }
    }

    Test类是可能会被多次创建的类,于是我们可以使用类似单例模式的一个方法写一个getInstance方法,在Test类里边添加Test可以创建的最大个数以及当前已经创建的数量;每次getInstance的时候都要做一些验证;如果超过最大数量,则可以做一些相关操作比较调用垃圾回收器,或者提示错误等等;另一个比较重要的操作就是要利用finallize方法;每当一个Test对象被回收之后,就立即更改当前Test的对象数量,以便别人可以获取该Test对象;

    ps:这种方法也会存在一个问题,就是如果使用反射机制来生成对象的时候,可能会遇到一些问题;

  • 相关阅读:
    Node.js 安装配置
    ITerm2配置-让你的mac命令行更加丰富高效
    ECharts 图表工具
    Vue 安装
    element-ui 安装
    mysql高级查询
    数据库第三章 参考
    DML和DQL 总结
    数据库第二章 参考答案
    数据库编程技术 第一章
  • 原文地址:https://www.cnblogs.com/roilat/p/3196235.html
Copyright © 2011-2022 走看看