多线程篇
注:今天只更新四题,明天就换别的了
1、concurrent包下有哪些类?
ConcurrentHashMap、Future、FutureTask、AtomicInteger...
2、线程a、b、c、d运行任务,怎么保证当a、b、c线程执行完再执行d线程?
1 、 CountDownLatch类⼀个同步辅助类,常⽤于某个条件发⽣后才能执⾏后续进程。给定计数初始化 CountDownLatch ,调⽤ countDown ()⽅法,在计数到达零之前,await ⽅法⼀直受阻塞。重要⽅法为 countdown ()与 await ();2 、 join⽅法将线程 B 加⼊到线程 A 的尾部,当 A 执⾏完后 B 才执⾏。public class ThreadSerialize { public static void main(String[] args) throws Exception { Th t = new Th("t1"); Th t2 = new Th("t2"); t.start(); t.join(); t2.start(); } }
3 、 notify 、 wait ⽅法, Java 中的唤醒与等待⽅法,关键为 synchronized 代码块,参数线程间应相同,也常⽤ Object 作为参数。
3、高并发系统如何进行性能优化?如何防止库存超麦?
1 、⾼并发系统性能优化:优化程序,优化服务配置,优化系统配置
- 尽量使⽤缓存,包括⽤户缓存,信息缓存等,多花点内存来做缓存,可以⼤量减少与数据库的交互,提⾼性能。
- ⽤jprofiler等⼯具找出性能瓶颈,减少额外的开销。
- 优化数据库查询语句,减少直接使⽤hibernate等⼯具的直接⽣成语句(仅耗时较⻓的查询做优化)。
- 优化数据库结构,多做索引,提⾼查询效率。
- 统计的功能尽量做缓存,或按每天⼀统计或定时统计相关报表,避免需要时进⾏统计的功能。
- 能使⽤静态⻚⾯的地⽅尽量使⽤,减少容器的解析(尽量将动态内容⽣成静态html来显示)。
- 解决以上问题后,使⽤服务器集群来解决单台的瓶颈问题。
2 、防⽌库存超卖:
- 悲观锁:在更新库存期间加锁,不允许其它线程修改;
数据库锁:select xxx for update;
分布式锁;- 乐观锁:使⽤带版本号的更新。每个线程都可以并发修改,但在并发时,只有⼀个线程会修改成功,其它会返回失败。
redis watch:监视键值对,作⽤时如果事务提交exec时发现监视的监视对发⽣变化,事务将被取消。- 消息队列:通过 FIFO 队列,使修改库存的操作串⾏化。
- 总结:总的来说,不能把压⼒放在数据库上,所以使⽤ "select xxx for update" 的⽅式在⾼并发的场景下是不可⾏的。FIFO 同步队列的⽅式,可以结合库存限制队列⻓,但是在库存较多的场景下,⼜不太适⽤。所以相对来说,我会倾向于选择:乐观锁 / 缓存锁 / 分布式锁的⽅式。
4、线程池的参数配置,为什么Java官方提供工厂方法给线程池?
1、线程池简介:
2、核心参数:
3 、⼯⼚⽅法作⽤: ThreadPoolExecutor 类就是 Executor 的实现类,但 ThreadPoolExecutor 在使⽤上并不是那么⽅便,在实例化时需要传⼊很多歌参数,还要考虑线程的并发数等与线程池运⾏效率有关的参数,所以官⽅建议使⽤Executors ⼯程类来创建线程池对象。