- concurrentHashMap中的size、isEmpty方法使用情况并不多,而且尽可能是一个当前情况的估计值
- 当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。临界区,它会产生竞态条件。在临界区中使用适当的同步就可以避免竞态条件。
- CopyOnWriteArrayList用于代替同步List,BlockingQueue也可以
- BlockingQueue和线程之间有生产者-消费者的概念,降低耦合
- LinkedBlockingQueue头和尾是两个不一样的锁,增加了处理的效率。默认无界,可设置参数为有界
- 中断将暂停某线程的工作(如果能够中断的话),可以通过方法恢复
- FutureTask是Future的一个实例类,可以达到线程间通信的效果
- CountDownLatch、信号量通过计数的方式控制时间的流程
- CyclicBarrier当一组线程同时达到某一个点的时候,同时放行
- Executor的shutdown方法不会接受新任务,但会把队列中已经存放的都执行完
- 而shutdownnow直接试图中断当前执行任务,队列中的不管了,通过拒绝策略处理
- 线程池可能会出现饥饿死锁的情况,队列中的被正在执行的线程依赖
- 哲学家问题,每个人拿一根筷子导致死锁
- JVM解决死锁手段没有数据库那么多,往往有可能发生死锁,降低效率
- 死锁产生的四个条件:
- 互斥条件:一个资源每次只能被一个进程使用。
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
- 避免死锁:加锁顺序、超时释放
- 饥饿:优先级阻塞队列,有些任务的优先级太低了导致一直不能执行
- 活锁:不能恢复的失败任务以为是能恢复的,放在队列开始再来一遍,结果就是永远执行不下去
09-05
09-05
09-05