• 一个非常简单的限定对象数量的方法


    有时在工作,可能会出现一些情况,我们不适合使用单例模式,但是又不允许无限制的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:这种方法也会存在一个问题,就是如果使用反射机制来生成对象的时候,可能会遇到一些问题;

  • 相关阅读:
    window上部署Flask
    PIP超时
    覆盖内敛样式
    解决js导出csv中文乱码
    没有为请求的 URL 配置默认文档,并且没有在服务器上启用目录浏览。
    nuget加载本地包
    DataTable表头对不齐、添加参数等方法总结
    根据class判断
    element-ui的table动态生成表头和数据,且表中数据可编辑
    VScode快捷键、Chrome快捷键知识小总结和状态码
  • 原文地址:https://www.cnblogs.com/roilat/p/3196235.html
Copyright © 2020-2023  润新知