この物語は、純粋に架空であり、任意の類似性は純粋な偶然です!
背景ストーリー
不寛容が規律を受けるため、悟空の指導の後4人は、花とフルーツ山に戻って、サル猿日影響を受けていない生のギャングを率い地獄の宮殿の名前で生と死のために猿の猿日の本、それは残念です、戻ってくることを学びます私たちは消され、猿の猿日が高まっています。
悟空はTaibaijinxingにアドバイスし、規律にでき、最もせっかちです。
猿のプレースメントテスト
試験の等級:彼の心にTaibaijinxing。
そして、タイトルを与えられました:
ユニバーサルカウンタを作成し、測定は、このような猿王バーなどの事、たくさんのことができます。
次のように参考答えは次のとおりです。
段階での猿:〜9のレベルが順次上昇
一次類人猿
パブリック クラスカウンタ{ プライベート 静的 int型の CNT = 0 ; 公共 int型の増加(){ リターン ++ CNT。 } 公共 int型の減少(){ リターン - CNT。 } }
ナレーター:機能を実現します。
二次類人猿
public class Counter2 { private static long cnt=0; public long increase() { return ++cnt; } public long decrease() { return --cnt; } }
旁白:考虑了int的范围限制,long的范围更广泛。
三阶猿类
public class Counter3 { private static long cnt=0; public synchronized long increase() { return ++cnt; } public synchronized long decrease() { return --cnt; } }
旁白:考虑了并发环境下的执行
四阶猿类
public class Counter4 { private static AtomicLong cnt=new AtomicLong(0); public long increase() { return cnt.getAndIncrement(); } public long decrease() { return cnt.getAndDecrement(); } }
旁白:考虑了并发环境下的cas性能更优
五阶猿类
public class Counter5 { private static LongAdder cnt=new LongAdder(); public long increase() { cnt.increment(); return cnt.longValue(); } public long decrease() { cnt.decrement(); return cnt.longValue(); } }
旁白:在单线程下,并发问题没有暴露,两者没有体现出差距;随着并发量加大,LongAdder 的 increment 操作更加优秀,而 AtomicLong 的 get 操作则更加优秀。鉴于在计数器场景下的特点—写多读少,所以写性能更高的 LongAdder 更加适合。
六阶猿类
public class Counter6 { private static JdbcTemplateUtils jdbc=new JdbcTemplateUtils(); private static long cnt=0; public long increase() { cnt=jdbc.getCnt(); return jdbc.setCnt(++cnt); } public long decrease() { cnt=jdbc.getCnt(); return jdbc.setCnt(--cnt);; } }
旁白:考虑了在集群环境下保证数据的唯一性和一致性。
七阶猿类
public class Counter7 { private static RedisclusterUtils redis=new RedisclusterUtils(); private static long cnt=0; public long increase() { return redis.incr(cnt); } public long decrease() { return redis.decr(cnt);; } }
旁白:考虑了计数器集群下的并发性能问题,同样的实现可以使用zk或者mongo等内存数据库。
八阶猿类
public class Counter8 { private static JdbcTempalteUtils jdbc=new JdbcTempalteUtils(); private static RedisclusterUtils redis=new RedisclusterUtils(); private static long cnt=0; public long increase() { if(redis.exsits(cnt)) { return redis.incr(cnt); } cnt=jdbc.getCnt(key); ++cnt; redis.set(key,cnt); return cnt; } public ロング減少(){ 場合(redis.exsits(CNT)){ 戻りredis.decr(CNT)。 } CNT = jdbc.getCnt(キー)。 - CNT; redis.set(キー、CNT); リターンCNT; } }
VO:、バックアッププログラムを処理Redisのダウンまたはそうでなければ利用できない場合を考えてみましょう。
ナインバンドの類人猿
これは、免除する必要があります。
参考文献:
【1】https://mp.weixin.qq.com/s/yAvJFZWxfKb38IDMjQd5zg