이 이야기는 순전히 허구이며, 유사하더라도 이는 전적으로 우연입니다!
배경 스토리
손오공 멘토링 후 4 명 편협은 징계를받을 수 있기 때문에, 다시 와서 배우고, 꽃과 과일 산으로 돌아 원숭이 일에 영향을받지 라이브, 그것은 유감 원숭이의 갱단을 주도하기 때문에 지옥의 궁전의 이름으로 삶과 죽음의 원숭이 원숭이 일의 책 우리는 밖으로 교차하고 원숭이 원숭이 일이 증가하고있다.
Wukong는 Taibaijinxing에 대한 조언, 훈련을 할 수없는, 가장 참을성이있다.
원숭이의 레벨 테스트
시험 등급 : 그의 마음에 Taibaijinxing.
그리고 제목을 제공 :
보편적 인 카운터를 만들고, 측정은 원숭이 왕 바 같은 일을 많이 할 수 있습니다.
다음과 같이 참조 대답은 :
단계에서 원숭이가하십시오 ~ 9 단계는 순차적으로 상승
먼저 주문 원숭이
공공 클래스 카운터 1 { 개인 정적 INT의 CNT = 0 ; 공공 INT의 증가 () { 반환 ++ CNT; } 공공 INT의 감소 () { 반환 - CNT; } }
나레이터는 다음 기능을 달성한다.
2 차 원숭이
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는 : 사건 처리 레디 스 다운되거나 사용할 수없는 백업 프로그램을 고려하십시오.
아홉 밴드 유인원
이 면제해야한다.
참고 :
【1】 https://mp.weixin.qq.com/s/yAvJFZWxfKb38IDMjQd5zg