品阿里 Java 开发手册有感

  • 时间:
  • 浏览:0
  • 来源:5分时时彩官网_去哪玩5分时时彩_哪里可以玩5分时时彩

摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢!

一另两个优秀的工程师和一另两个普通的工程师的区别,也有满天飞的架构图,他的功底体现在所写的每一行代码上。

-- 毕玄

1. 命名风格

【书摘】类名用 UpperCamelCase 风格,比如 DO/BO/VO/PO

【书摘】法律土办法用 lowerCamelCase 风格,尽量是动词

小思考:类似常用的

- 获取单个对象,getUserById

- 获取对象累不,listUserByGroupId

- 统计对象数量,countUserByClassId

- 新增、删除,insert,delete,update 等

2. 常量定义

【书摘】不可能 变量值仅在一另两个范围变化,则用 enum 类型

小思考:类似电商中订单情况汇报,用手指不还都可不可以 列出来。好多好多 一般定义个 OrderSatausEnum 背熟,伪代码如下:

public enum OrderSatausEnum {
    TO_PAY(1,"代付款"), PAID(2,"已付款") ...;

    private Integer orderStatus;
    private String orderSatausDes;

    OrderSatausEnum(Integer orderStatus,String orderSatausDes) {
        this.orderStatus = orderStatus;
        this.orderSatausDes = orderSatausDes;
    }

    

进一步,不可能 订单某天要加个“待拼团”情况汇报怎办?好多好多 哪些地方地方配置化的东西,可不让还都可不可以 上配置中心。比如携程出的 apollo 等

3. OOP 规则

【书摘】Object 的 equals 法律土办法容易抛空指针异常,应使用常量不可能 取舍优质的对象来调用 equals 。

比如:“TO_PAY”.equals(order.getOrderStatus())。反着写就不对了,不可能 order.getOrderStatus() 不可能 为 null。

自然,更加推荐 java.util.Objects#equals 工具类。

【书摘】所有相类似型的包装类对象之间的值比较,完整版使用 equals 法律土办法。

小思考:别用 == 了。equals 也要注意些事情,比如 Byte 类型的 status 对象值,用 equals 要注意如下:

getStatus().equals(0) 

还有, == 比如 Integer 在 -128 到 127 范围比较正常,超过就不正常。原应是 -128 到 127 范围的对象在 IntegerCache.cache 中产生,会复用对象。好多好多 好多好多 ,切记切记,别用 == 了,用 equals 去比较。

4. 集合处里

【书摘】暂且在 for 循环中进行元素的 remove/add 操作。remove 请使用 Iterator 法律土办法,不可能 有并发操作,则对 Iterator 对象加锁。

具体 Iterator 为啥操作集合,百度下即可。这还是典型的 迭代器设计模式,可不让还都可不可以 深入源码看看人家的简单实现原理,又能学到一发高级知识。

5. 并发处里

【书摘】第一,线程池池可不让还都可不可以 通过线程池池池来提供,不允许显式创建线程池池。第二,线程池池池不允许用 Executors 创建,应使用 ThreadPoolExecutor 去创建。不可能

Executors 创建的几种 ThreadPool 会有弊端:

  • FixedThreadPool 和 SingleThreadPool 允许请求队列长度为 Integer.MAX_VALUE ,大量请求,会原应 OOM
  • CachedThreadPool 和 ScheduledThreadPool 允许创建最大的线程池池数为 Integer.MAX_VALUE,大量创建线程池池,会原应 OOM

好多好多 ,使用 ThreadPoolExecutor 的原应是能更好地理解线程池池池的运行规则,规避资源耗尽,更好地贴合某个业务场景,去创建更适合的线程池池池。


【书摘】在高并发场景中,同步调用应该考虑锁的性能损耗。能用无锁数据特性,就暂且用锁;能锁区块,就暂且锁整个法律土办法体;能用对象锁,就暂且用类锁。即,加锁的粒度越小,性能损耗越小。为啥让处里锁的代码块中调用了 RPC 法律土办法。

另外,一起去对多个资源加锁的很久,可不让还都可不可以 保持一致的加锁顺序。为啥让,一另两个线程池池加锁顺序为 ABC,曾经加锁顺序为 ACB 或 BAC 等,会造成死锁。如图:


【书摘】金融资金相关信息,使用悲观锁。比如更新某个用户的钱包余额字段。

小思考:我很久做 P2P 的很久,就很简单地使用了 MySQL 的行锁。

SELECT * FROM xx WHREER xx.id=888 FOR UPDATE

具体行锁,表锁朋友可不让还都可不可以 自行百度了解。

6. 控制得话

【书摘】高并发场景,比如秒杀场景,商品扣库存,库存的判断暂且用“等于”来判断商品库存已售罄的条件。应使用大于不可能 小于的条件来代替。

小思考:这是典型的超卖场景。一群人会问也会处于超卖几件的问题图片图片吧?答案是是的。但不可能 用 等于 来判断,超卖的件数会好多好多 好多好多 ,比如达到 1 万件。但超卖 1 万件和超卖 1 件是不一样等级的故障。不可能 是一另两个故障和一另两个也有故障的区别。

7.异常处里

【书摘】异常暂且用来做流程控制,条件控制

小思考:昨天京东小哥问我,你这些能那末 搞降级吗?如下代码:

try {
    searchFromES()
}catch(){
    searchFromDB()
}

这不算降级,这为啥让能那末 搞。第一,代码这也写就不对,异常暂且用来做流程控制,条件控制。第二,你这些假如有一天实现 ES 读取有问题图片图片,读取可不让还都可不可以 就读 DB。可不让还都可不可以 考虑责任链设计模式去实现。伪代码如下:



ESHandle { void handle() { try { searchFromES() }catch(){ } } } DBHandle { void handle() { try { searchFromES() }catch(){ } } }

8. 建表规约 、SQL 得话

【书摘】当单表行数超过 2000 万行不可能 单表容量超过 2 GB时,才推荐进行分库分表。

不可能 预计三年后的数量级无法达到你这些级别,请暂且在创建表时就分库分表。


【书摘】暂且使用 count(列名) 不可能 count(常量) 来替代 count(*)。 不可能 它是 SQL92 定义的标准统计行数的预发。它会统计 NULL 的行。


【书摘】where 条件下顶端的 in 能处里就处里,要注意 in 顶端的集合数量,控制在 2000 个之内。


【书摘】在代码中写分页查询,不可能 count 为 0 ,直接返回 空列表。处里执行下面的分页得话。

9.服务器

【书摘】高并发服务器建议调小 TCP 协议的 time_wait 超时时间。Linux 修改 /etc/sysctl.conf 文件,代码如下:

net.ipv4.tcp_fin_timeout = 200

【书摘】JVM 设置参数 -XX:+HeapDumpOnOutOfMemoryError。让 JVM 碰到 OOM 的很久,输出 dump 信息。

小思考:你这些有点要。二者得保留事故服务器现场。比如 OOM 了某个服务器,则在 VIP 不可能 啥摘到该机器,让该机器不再有请求进入。为啥让去查看 dump 信息,去排查 OOM 问题图片图片。

最后

感谢小册子《阿里巴巴 Java 开发手册》,感觉不错。大约其蕴含几点,有目共睹的。

(关注微信公众号,领取 Java 精选干货学习资料)