0
点赞
收藏
分享

微信扫一扫

Java小白踩坑录 - 猿类分级考试实录


Java小白踩坑录 - 猿类分级考试实录_Java小白踩坑录

猿类分阶:1~9 依次上升


一阶猿类

public class Counter1 {
private static int cnt=0;

public int increase() {
return ++cnt;
}

public int decrease() {
return --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();//JdbcTemplateUtils封装了jdbc的调用
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();//RedisclusterUtils封装了Rediscluster的client功能
private static long cnt=0;

public long increase() {
return redis.incr(cnt);
}

public long decrease() {
return redis.decr(cnt);;
}
}

旁白:考虑了计数器集群下的并发性能问题,同样的实现可以使用 zk 或者 mongo 等内存数据库。

注:ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 Hbase 的重要组件。MongoDB 是一个基于分布式文件存储的数据库。


八阶猿类

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 long decrease() {
if(redis.exsits(cnt)) {
return redis.decr(cnt);
}
cnt=jdbc.getCnt(key);
--cnt;
redis.set(key,cnt);

return cnt;
}
}

旁白:考虑到 Redis 宕机或者不可用的情况下的处理,有备份方案。


九阶猿类

这个要免考的。


举报

相关推荐

0 条评论