并发处理
1.任何时候获取单例对象都要保证线程安全,其中的方法也要保证线程安全;
2.创建线程的时候 最好要用线程的名称去表述是做什么的;
3.线程资源必须通过线程池去创建,不允许显示的创建,避免系统创建大量同样的线程而导致内存的浪费
4.不允许通过Executor去创建 而应该用ThreadPoolExecutor **
5.SimpleDateFormat是线程不安全的,反正也不用了以后 Date 用Instant替换,Calander用LocalDateTime替换 SimpleDateFormat 用DateTimeFormmater替换
6.须回收自定义的ThreadLocal变量,尤其在线程池场景下,线程经常会被复用,如果不清理自定义的 ThreadLocal 变量,可能会影响后续业务逻辑和造成内存泄露等问题。尽量在代理中使用 try-finally 块进行回收。
7.高并发时,同步调用应该去考量锁的性能损耗。能用无锁数据结构,就不要用锁;能锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。说明:尽可能使加锁的代码块工作量尽可能的小,避免在锁代码块中调用 RPC 方法。
8.在使用阻塞等待获取锁的方式中,必须在try代码块之外,并且在加锁方法与try代码块之间没有任何可能抛出异常的方法调用,避免加锁成功后,在 finally 中无法解锁
控制语句
1.在一个switch块内,每个case要么通过continue/break/return等来终止,要么注释说明程序将继续执行到哪一个 case 为止;在一个 switch 块内,都必须包含一个default 语句并且放在最后,即使它什么代码也没有。
2.当switch括号内的变量类型为String并且此变量为外部参数时,必须先进行null判断。
3.在高并发情况下,尽量减少使用==来做判断,有一种可能就是发送奖品如果你写==0结束 ,突然来了好多请求数字一下子变成负数了,这样就没办法了,所以可以改成小于零,这样就不会出现击穿了
4.