小言_互联网的博客

《Java开发手册》阅读笔记(三)

409人阅读  评论(0)

一、集合处理

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场