PageSourceSearch

http://ibeetl.com/assets/index.html-BCC_Mp8P.js

js ibeetl.com collected 2026-10-03 23:20:07 UTC 58,705 bytes, 126 lines download raw bytes

1import{_ as i,c as a,b as n,o as l}from"./app-CNefOTx1.js";const h={};function k(e,s){return l(),a("div",null,s[0]||(s[0]=[n(`<h2 id="_5-2-对象池" tabindex="-1"><a class="header-anchor" href="#_5-2-对象池"><span>5.2 对象池</span></a></h2><p>在上文提到的重量级对象特征是构造复杂,在使用此对象过程中,对象会缓存中间处理过程,如Jackson的ObjectMapper,Beetl的GroupTemplate,还有Gson序列化工具等等,还有一类重量级对象则是网络相关的客户端对象,如数据库连接池,以及Redis客户端Jedis使用JedisPool,这类是重量级别对象原因是建立网络链接是非常耗时的操作,应用希望一旦建立后,就会保持此链接。这时候,就需要使用池化技术。池化技术提供了对象重用机制</p><p>使用池化技术另外一个原因是减少对象的创建个数,总是复用之前创建的对象,从而减小垃圾回收时间</p><p>现在有一个对象链接Redis,定义如下</p><div class="language-java line-numbers-mode" data-ext="java" data-title="java"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> class</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> RedisClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
2<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">    String</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> ip</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
3<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    int</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> port</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
4<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    public</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> RedisClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">String </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">ip</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">int</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> port</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">){</span></span>
5<span class="line"><span style="--shiki-light:#A65E2B;--shiki-dark:#C99076;">        this</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">ip</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> ip</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
6<span class="line"><span style="--shiki-light:#A65E2B;--shiki-dark:#C99076;">        this</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">port</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> port</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
7<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    }</span></span>
8<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> void</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> connect</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(){</span></span>
9<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">        System</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">out</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">println</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">&quot;</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">connect redis </span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">&quot;</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
10<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    }</span></span>
11<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">    </span></span>
12<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> void</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> close</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(){</span></span>
13<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">        System</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">out</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">println</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">&quot;</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">close  </span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">&quot;</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
14<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    }</span></span>
15<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>connect方法将会链接Redis 服务器,close方法则会管理链接,为了简单期间,省略了socket链接代码,RedisClient是一个重量级对象,可以使用使用Apache Commons Pool来实现对象池化,Commons Pool提供了<strong>BasePooledObjectFactory</strong> 可以方便的创建和管理对象,如下定义</p><div class="language-java line-numbers-mode" data-ext="java" data-title="java"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> class</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> RedisClientPooledObjectFactory</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> extends</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> BasePooledObjectFactory</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&lt;</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">RedisClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&gt;</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
16<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">        String</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> ip</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
17<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">        int</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">
17 port</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
18<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">        public</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> RedisClientPooledObjectFactory</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">String </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">ip</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">int</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> port</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">){</span></span>
19<span class="line"><span style="--shiki-light:#A65E2B;--shiki-dark:#C99076;">                this</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">ip</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> ip</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
20<span class="line"><span style="--shiki-light:#A65E2B;--shiki-dark:#C99076;">                this</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">port</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> port</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
21<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">        }</span></span>
22<span class="line"></span>
23<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">        @</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">Override</span></span>
24<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">        public</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> RedisClient </span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">create</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">()</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> throws</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> Exception </span><span style="--shiki-light:#999999;--shiki-dark:#666666;">
24{</span></span>
25<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">                RedisClient</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> redisClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">  new</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> RedisClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">ip</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">port</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
26<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">                redisClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">connect</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
27<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">                return</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> redisClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
28<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">        }</span></span>
29<span class="line"></span>
30<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">        @</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">Override</span></span>
31<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">        public</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> PooledObject</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&lt;</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">RedisClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&gt;</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> wrap</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">RedisClient </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">redisClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
32<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">                return</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> new</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> DefaultPooledObject</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&lt;</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">RedisClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&gt;(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">redisClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
33<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">        }</span></span>
34<span class="line"></span>
35<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">        @</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">Override</span></span>
36<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">        public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> void</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> destroyObject</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">PooledObject</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&lt;</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">RedisClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&gt;</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> p</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> throws</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> Exception</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">
36{</span></span>
37<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">                RedisClient</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> redisClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> p</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">getObject</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
38<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">                redisClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">close</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
39<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">        }</span></span>
40<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>通常需要实现create方法,用于创建重量级对象,wrap方法用于对象池管理,对象池不直接管理我们创建的对象,而是管理PooledObject,可以用DefaultPooledObject构造一个默认实现。destroyObject方法用于对象池销毁的时候,关闭重量级对象</p><p>有了RedisClientPooledObjectFactory,就可以构造GenericObjectPool,</p><div class="language-java line-numbers-mode" data-ext="java" data-title="java"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> class</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> RedisClientPoolUtil</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
41<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">        GenericObjectPool</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&lt;</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">RedisClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&gt;</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> genericObjectPool</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
42<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">        public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> void</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> init</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">String </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">ip</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">int</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> port</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">int</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> max</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">){</span></span>
43<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">                GenericObjectPoolConfig</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> config</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> new</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> GenericObjectPoolConfig</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
44<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">                config</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">setMaxTotal</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">max</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
45<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">                genericObjectPool </span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> new</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> GenericObjectPool</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">new</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> RedisClientPooledObjectFactory</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">ip</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">port</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">),</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">config</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
46<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">        }</span></span>
47<span class="line"></span>
48<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">        public</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> RedisClient </span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">getOne</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">()</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> throws</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> Exception </span><span style="--shiki-light:#999999;--shiki-dark:#666666;">
48{</span></span>
49<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">                return</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> genericObjectPool</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">borrowObject</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
50<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">        }</span></span>
51<span class="line"></span>
52<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">        public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> void</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> returnObject</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">RedisClient </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">redisClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">){</span></span>
53<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">                genericObjectPool</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">returnObject</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">redisClient</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
54<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">        }</span></span>
55<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>如上代码构造了最多构造5个RedisClient的对象池,并封装了getOne方法用于从池里借出一个未使用的RedisClient,returnObject,把RedisClient归还到池里,如下代码测试</p><div class="language-java line-numbers-mode" data-ext="java" data-title="java"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> class</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> PoolTest</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
56<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">        static</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> RedisClientPoolUtil</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> util</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> new</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> RedisClientPoolUtil</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
57<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">        static</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">
57{</span></span>
58<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">                util</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">init</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">&quot;</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">127.0.0.1</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">&quot;</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">9090</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">3</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
59<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">        }</span></span>
60<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">        public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> static</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> void</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> main</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">String</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">[]</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> args</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> throws</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> Exception </span><span style="--shiki-light:#999999;--shiki-dark:#666666;">
60{</span></span>
61<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">                RedisClient</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> redisClient1</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> util</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">getOne</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
62<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">                RedisClient</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> redisClient2</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> util</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">getOne</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
63<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">                RedisClient</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> redisClient3</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> util</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">getOne</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
64<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">                //会阻塞住,因为总共创建了3个</span></span>
65<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">                RedisClient</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> redisClient4</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> util</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">getOne</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
66<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">        }</span></span>
67<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>除了使用Common Pool技术外,还有更为简单的池化技术。比如用队列放入已经初始化好的对象。需要的时候从队列里取出,使用完毕放回队列。另外一个更为简单的方式是使用ThreadLocal来存放初始化好的对象。假定需要池化对象是要给字符数组,使用队列方式</p><div class="language-java line-numbers-mode" data-ext="java" data-title="java"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">/*定义一个需要重用得对象*/</span></span>
68<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> class</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> Buffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">
68{</span></span>
69<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    char</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">[]</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">  cs</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
70<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    public</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> Buffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">int</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> size</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">){</span></span>
71<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">        cs </span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> new</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> char</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">[</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">size</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">];</span></span>
72<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    }</span></span>
73<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> char</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">[]</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> getContent</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(){</span></span>
74<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">        return</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> cs</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
75<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    }</span></span>
76<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>使用队列方式</p><div class="language-java line-numbers-mode" data-ext="java" data-title="java"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> class</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> BufferPool</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">
76{</span></span>
77<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">   prvate </span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">static</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> BufferPool</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> pool</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> new</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> BufferPool</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
78<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">   ArrayBlockingQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&lt;</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">Buffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&gt;</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">  queue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> ;</span></span>
79<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">   private</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> BufferPool</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(){</span></span>
80<span class="line"><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">       init</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
81<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">   }</span></span>
82<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">   /*初始化buffer*/</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> </span></span>
83<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">   private</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> void</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> init</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(){</span></span>
84<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">       queue </span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> new</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> ArrayBlockingQueue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&lt;&gt;(</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">64</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
85<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">       for</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">int</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> i</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">=</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">0</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">i</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">&lt;</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">64</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">i</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">++</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">){</span></span>
86<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">           queue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">put</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">new</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> Buffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">1024</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
87<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">       }</span></span>
88<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">   }</span></span>
89<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">   /*采用单例模式*/</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> </span></span>
90<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">   public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> static</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> BufferPool </span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">instance</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(){</span></span>
91<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">       return</span><span style="--shiki-light:#A65E2B;--shiki-dark:#C99076;"> this</span></span>
92<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">   }</span></span>
93<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">   public</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> Buffer </span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">getBuffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(){</span></span>
94<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">       return</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> queue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">take</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">()</span></span>
95<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">   }</span></span>
96<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">   public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> void</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> release</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">Buffer buffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">){</span></span>
97<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">       queue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">put</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">buffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
98<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">   }</span></span>
99<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">   /*清空池*/</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">                  </span></span>
100<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">   public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> void</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> close</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(){</span></span>
101<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">       queue</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">clear</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">()</span></span>
102<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">   }</span></span>
103<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>使用ThreadLocal方式如下</p><div class="language-plaintext line-numbers-mode" data-ext="plaintext" data-title="plaintext"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span>public class BufferPool{</span></span>
104<span class="line"><span>   static  ThreadLocal&lt;Buffer cache = ThreadLocal.withInitial((Supplier) () - new Buffer(1024));</span></span>
105<span class="line"><span>   public  static Buffer getBuffer(){return cache.take()}}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>使用队列方式得优点是可以提供扩容”池“功能,缩容池,甚至释放池的功能。缺点是使用完毕必须归还,因此调用代码应该如下方式</p><div class="language-java line-numbers-mode" data-ext="java" data-title="java"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> class</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> BufferPool</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">
105{</span></span>
106<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">   static</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">  ThreadLocal</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&lt;</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">Buffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&gt;</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> cache</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> ThreadLocal</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">withInitial</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">((</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">Supplier</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> ()</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> -&gt;</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> new</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> Buffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">1024</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">));</span></span>
107<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">   public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">  static</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> Buffer </span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">getBuffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(){</span></span>
108<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">       return</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> cache</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">take</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">()</span></span>
109<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">   }</span></span>
110<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>使用ThreadLocal的缺点是池的容量大小依赖于线程数,池的的容量是否可控,取决于调用时候的线程数,其创建和销毁依赖于线程的生命周期</p><p>ThreadLocal 不具备动态调整池大小功能,依赖线程数大小,如果担心内存溢出,可以使用SoftReference</p><div class="language-java line-numbers-mode" data-ext="java" data-title="java"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> class</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> BufferPool</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">
110{</span></span>
111<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">  static</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">  ThreadLocal</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&lt;</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">SoftReference</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&lt;</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">Buffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&gt;&gt;</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> cache</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> ThreadLocal</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">withInitial</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">((</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">Supplier</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> ()</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> -&gt;</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> </span></span>
112<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">                  new</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> SoftReference</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> (</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">new</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> Buffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">1024</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)));</span></span>
113<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">  </span></span>
114<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">  public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">  static</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> Buffer </span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">getBuffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(){</span></span>
115<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">    SoftReference</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&lt;</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">Buffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">&gt;</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> srf</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">  cache</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">take</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
116<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">    Buffer</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> buffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> srf</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">get</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">();</span></span>
117<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">    //判断是否被垃圾回收</span></span>
118<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">    if</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">buffer</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">!=</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">null</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">}</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">
118{</span></span>
119<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">      return</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> buffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
120<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    }</span></span>
121<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">    //如果回收了,重新构造一个   </span></span>
122<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">    Buffer</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> buffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> new</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> Buffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">1024</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">   ;</span></span>
123<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">    srf</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">set</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">buffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
124<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">    return</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> buffer</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">   </span></span>
125<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">  }</span></span>
126<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>`,23)]))}const p=i(h,[["render",k],["__file","index.html.vue"]]),d=JSON.parse('{"path":"/article/performance/policy_pool/","title":"性能优化-对象池","lang":"en-US","frontmatter":{"title":"性能优化-对象池","tags":["性能","新书"],"createTime":"2026/08/21 12:36:15","permalink":"/article/performance/policy_pool/","description":"5.2 对象池 在上文提到的重量级对象特征是构造复杂,在使用此对象过程中,对象会缓存中间处理过程,如Jackson的ObjectMapper,Beetl的GroupTemplate,还有Gson序列化工具等等,还有一类重量级对象则是网络相关的客户端对象,如数据库连接池,以及Redis客户端Jedis使用JedisPool,这类是重量级别对象原因是建立网...","head":[["meta",{"property":"og:url","content":"http://ibeetl.com/article/performance/policy_pool/"}],["meta",{"property":"og:site_name","content":"闲大赋"}],["meta",{"property":"og:title","content":"性能优化-对象池"}],["meta",{"property":"og:description","content":"5.2 对象池 在上文提到的重量级对象特征是构造复杂,在使用此对象过程中,对象会缓存中间处理过程,如Jackson的ObjectMapper,Beetl的GroupTemplate,还有Gson序列化工具等等,还有一类重量级对象则是网络相关的客户端对象,如数据库连接池,以及Redis客户端Jedis使用JedisPool,这类是重量级别对象原因是建立网..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2026-08-21T06:57:39.000Z"}],["meta",{"property":"article:tag","content":"性能"}],["meta",{"property":"article:tag","content":"新书"}],["meta",{"property":"article:modified_time","content":"2026-08-21T06:57:39.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"性能优化-对象池\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"202
1266-08-21T06:57:39.000Z\\",\\"author\\":[]}"]]},"headers":[],"readingTime":{"minutes":3.7,"words":1109},"git":{"updatedTime":1787295459000,"contributors":[{"name":"lijiazhi","username":"lijiazhi","email":"[email protected]","commits":1,"avatar":"https://gravatar.com/avatar/1b5114831459724ad4acc394423b4b48ecfa4a7e0659fbe07a0ce5181a1050a7?d=retro"}]},"autoDesc":true,"filePathRelative":"article/性能/object_pool.md","categoryList":[{"id":"92a2b5","sort":10000,"name":"article"},{"id":"afdb50","sort":10004,"name":"性能"}]}');export{p as comp,d as data};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.