화과 첫 번째 원숭이의 레벨 테스트 기록 --Talk 저렴, 나에게 코드를보기

이 이야기는 순전히 허구이며, 유사하더라도 이는 전적으로 우연입니다!

배경 스토리

제 화과 배치 테스트 기록 유인원 - 유인원, 레벨 판정 카운터 달성에있어서

 

손오공 멘토링 후 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

추천

출처www.cnblogs.com/davidwang456/p/11550965.html