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

一、集合处理

1、只要覆写 equals,就必须覆写 hashCode;Set集合存储对象必须重写hashCode和equals;自定义对象作为map的key必须重写…

image.png

2、ArrayList 的 subList 结果不可强转成ArrayList

image.png

3、Map集合的keySet,values,entrySet返回集合对象时不可进行添加操作;Conllections返回的对象,不能进行添加删除操作,sublist使用时,不要对原集合进行操作

image.png

4、使用集合转数组必须使用集合的toArray(数组),传入的必须是空数组,不能使用toArray的无参方法

image.png

5、Collection接口任何实现类使用addAll()时都要进行空指针判断,Arrays.asList()把数组转换成集合时,不能对数组进行修改操作

image.png

6、泛型通配符<? extends T>不嫩使用add方法,适合经常往外取数据,

<? super T>不能使用 get 方法,适合经常插入数据,没有泛型限制定义的集合需要进行类型判断

image.png

7、foreach循环里进行增删操作,考虑使用迭代器

Comparator.sort()时,要处理三种情况

image.png

8、集合泛型定义时,使用 diamond 语法或全省略。

集合初始化时,置顶集合大小

遍历map集合使用entrySet

image.png

9、Map集合不能为空的情况

hashMap都可以为空

treeMap值可以为空

image.png

10、合理利用好集合的有序性(sort)和稳定性(order)

image.png

二、并发处理

11、单例对象和方法要保证线程安全;线程池的名称要有意义

image.png

12、线程资源必须由线程池来提供,线程池使用ThreadPoolExecutor创建,SimpleDateFormat定义为static变量时加锁

image.png

13、必须回收自定义的 ThreadLocal 变量,尽量在代理中使用 try-finally 块进行回收。

image.png

14、考虑锁的性能,尽可能使加锁的代码块工作量尽可能的小;保持加锁顺序一致

image.png

15、在使用阻塞等待获取锁的方式中,必须在 try 代码块之外,并且在加锁方法与 try 代 码块之间没有任何可能抛出异常的方法调用

image.png

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 次。

image.png

18、多线程并行处理定时任务时,Timer 运行多个 TimeTask 时,只要其中之一没有捕获 抛出的异常,其它任务便会自动终止运行,如果在处理定时任务时使用ScheduledExecutorService 则没有这个问题。

image.png

19、资金相关信息建议使用悲观锁,使用CountDownLatch进行异步转同步操作确保countDown方法被执行,多线程情况下建议使用ThreadLocalRandom

image.png

20、多线程HashMap高并发可能出现死链,ThreadLocal不能解决共享对象更新问题

image.png

更多文章:爱敲代码的小游子

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值