zoukankan      html  css  js  c++  java
  • 对象池模式【其他模式】

    对象池模式

    package org.zxd.design.pattern.others.objectpool;
    
    import static org.junit.Assert.assertTrue;
    
    import java.util.HashSet;
    import java.util.Set;
    
    import org.junit.Test;
    
    import lombok.extern.slf4j.Slf4j;
    
    public class ObjectPool {
    
        /**
         * 对象池模式:当创建对象和释放对象消耗很大时,可以使用对象池模式实现复用。
         */
        @Test
        public void all() {
            final HeavyPool pool = new HeavyPool();
            final Heavy h1 = pool.checkOut();
            h1.dowork();
    
            pool.checkIn(h1);
            assertTrue(h1 == pool.checkOut());
        }
    }
    
    @Slf4j
    class Heavy {
        public Heavy() {
            log.info("initialize for 5 seconds");
            Runtime.getRuntime().addShutdownHook(new Thread(() -> release()));
        }
    
        public void dowork() {
            log.info("do short work");
        }
    
        public void release() {
            log.info("do release");
        }
    }
    
    class HeavyPool extends Pool<Heavy> {
    
        @Override
        protected Heavy create() {
            return new Heavy();
        }
    }
    
    abstract class Pool<T> {
        private final Set<T> available = new HashSet<>();
        private final Set<T> inUse = new HashSet<>();
    
        protected abstract T create();
    
        public synchronized T checkOut() {
            if (available.isEmpty()) {
                available.add(create());
            }
            final T instance = available.iterator().next();
            available.remove(instance);
            inUse.add(instance);
            return instance;
        }
    
        public synchronized void checkIn(T instance) {
            inUse.remove(instance);
            available.add(instance);
        }
    
        @Override
        public synchronized String toString() {
            return String.format("Pool available=%d inUse=%d", available.size(), inUse.size());
        }
    }
    
  • 相关阅读:
    putty配置
    BroadcastReceiver应用详解 (转)
    linux主设备号和次设备号
    Enable screen lock and HOME key (eclair and older versions)(转)
    C#获取用户桌面等特殊系统路径
    java中Thread与Runnable的区别
    博文索引
    FlinkCDC实践
    关于libxml2.so.2不被Gstreamer链接的解决
    s.length什么意思
  • 原文地址:https://www.cnblogs.com/zhuxudong/p/10171110.html
Copyright © 2011-2022 走看看