Эта история является чисто фиктивным и любое их сходство является чисто случайным!
Фоновая история
После того, как Гоку наставничества 4 люди учатся, чтобы вернуться, потому что нетерпимость получить дисциплину, вернулся цветов и фруктов горы, привело банда обезьян обезьян ВС не влияет жить, это прискорбно, потому что книга обезьяна обезьяна Солнца жизни и смерти во имя дворца ада Мы вычеркнуты, и обезьяна обезьяны вС растет.
Укун является наиболее нетерпеливым, неспособным к дисциплине, с советом к Taibaijinxing.
Тест размещения Apes
Taibaijinxing в его уме: экзаменационный.
И дали название:
Создать универсальный счетчик, измерение может быть много вещей, таких как Monkey King Bar.
Ссылка ответ выглядит следующим образом:
Приматы в фазах: а ~ девять уровней последовательно расти
приматы первого порядка
общественный класс Counter1 { частный статический ИНТ CNT = 0 ; общественное ИНТ увеличение () { возвращение ++ НКТ; } Общественного ИНТ уменьшение () { возвращение - 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); вернуться НКТ; } }
VO: Рассмотрим случай, когда Redis обработки вниз или недоступен, программа резервного копирования.
Девять полос приматы
Это должно освобождение.
Ссылки:
【1】 https://mp.weixin.qq.com/s/yAvJFZWxfKb38IDMjQd5zg