一、集合处理
1、只要覆写 equals,就必须覆写 hashCode;Set集合存储对象必须重写hashCode和equals;自定义对象作为map的key必须重写…
2、ArrayList 的 subList 结果不可强转成ArrayList
3、Map集合的keySet,values,entrySet返回集合对象时不可进行添加操作;Conllections返回的对象,不能进行添加删除操作,sublist使用时,不要对原集合进行操作
4、使用集合转数组必须使用集合的toArray(数组),传入的必须是空数组,不能使用toArray的无参方法
5、Collection接口任何实现类使用addAll()时都要进行空指针判断,Arrays.asList()把数组转换成集合时,不能对数组进行修改操作
6、泛型通配符<? extends T>不嫩使用add方法,适合经常往外取数据,
<? super T>不能使用 get 方法,适合经常插入数据,没有泛型限制定义的集合需要进行类型判断
7、foreach循环里进行增删操作,考虑使用迭代器
Comparator.sort()时,要处理三种情况
8、集合泛型定义时,使用 diamond 语法或全省略。
集合初始化时,置顶集合大小
遍历map集合使用entrySet
9、Map集合不能为空的情况
hashMap都可以为空
treeMap值可以为空
10、合理利用好集合的有序性(sort)和稳定性(order)
二、并发处理
11、单例对象和方法要保证线程安全;线程池的名称要有意义
12、线程资源必须由线程池来提供,线程池使用ThreadPoolExecutor创建,SimpleDateFormat定义为static变量时加锁
13、必须回收自定义的 ThreadLocal 变量,尽量在代理中使用 try-finally 块进行回收。
14、考虑锁的性能,尽可能使加锁的代码块工作量尽可能的小;保持加锁顺序一致
15、在使用阻塞等待获取锁的方式中,必须在 try 代码块之外,并且在加锁方法与 try 代 码块之间没有任何可能抛出异常的方法调用
16、在使用尝试机制来获取锁的方式中,进入业务代码块之前,必须先判断当前线程是 否持有锁。锁的释放规则与锁的阻塞等待方式相同。
说明:Lock 对象的 unlock 方法在执行时,它会调用 AQS 的 tryRelease 方法(取决于具体实现类),如果
当前线程不持有锁,则抛出 IllegalMonitorStateException 异常。
例子:
Lock lock = new XxxLock(); // ...
boolean isLocked = lock.tryLock();
if (isLocked) {
try {
doSomething();
doOthers();
} finally {
lock.unlock();
}
}
17、并发修改同一记录时,避免更新丢失,需要加锁。要么在应用层加锁,要么在缓存 加锁,要么在数据库层使用乐观锁,使用 version 作为更新依据。
如果每次访问冲突概率小于 20%,推荐使用乐观锁;
否则使用悲观锁。乐观锁的重试次数不得小于 3 次。
18、多线程并行处理定时任务时,Timer 运行多个 TimeTask 时,只要其中之一没有捕获 抛出的异常,其它任务便会自动终止运行,如果在处理定时任务时使用ScheduledExecutorService 则没有这个问题。
19、资金相关信息建议使用悲观锁,使用CountDownLatch进行异步转同步操作确保countDown方法被执行,多线程情况下建议使用ThreadLocalRandom
20、多线程HashMap高并发可能出现死链,ThreadLocal不能解决共享对象更新问题
更多文章:爱敲代码的小游子
转载:https://blog.csdn.net/qq_44895397/article/details/110424595
查看评论