Java面试题(每天10题)-------连载(31)

多线程篇

注:今天只更新四题,明天就换别的了

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 、⾼并发系统性能优化:
优化程序,优化服务配置,优化系统配置
  1. 尽量使⽤缓存,包括⽤户缓存,信息缓存等,多花点内存来做缓存,可以⼤量减少与数据库的交互,提⾼性能。
  2. jprofiler等⼯具找出性能瓶颈,减少额外的开销。
  3. 优化数据库查询语句,减少直接使⽤hibernate等⼯具的直接⽣成语句(仅耗时较⻓的查询做优化)。
  4. 优化数据库结构,多做索引,提⾼查询效率。
  5. 统计的功能尽量做缓存,或按每天⼀统计或定时统计相关报表,避免需要时进⾏统计的功能。
  6. 能使⽤静态⻚⾯的地⽅尽量使⽤,减少容器的解析(尽量将动态内容⽣成静态html来显示)。
  7. 解决以上问题后,使⽤服务器集群来解决单台的瓶颈问题。
2 、防⽌库存超卖:
  1. 悲观锁在更新库存期间加锁,不允许其它线程修改;
    数据库锁:select xxx for update
    分布式锁;
  2. 乐观锁:使⽤带版本号的更新。每个线程都可以并发修改,但在并发时,只有⼀个线程会修改成功,其它会返回失败。
    redis watch:监视键值对,作⽤时如果事务提交exec时发现监视的监视对发⽣变化,事务将被取消。
  3. 消息队列:通过 FIFO 队列,使修改库存的操作串⾏化。
  4. 总结:总的来说,不能把压⼒放在数据库上,所以使⽤ "select xxx for update" 的⽅式在⾼并发的场景下是不可⾏的。FIFO 同步队列的⽅式,可以结合库存限制队列⻓,但是在库存较多的场景下,⼜不太适⽤。所以相对来说,我会倾向于选择:乐观锁 / 缓存锁 / 分布式锁的⽅式。 

4、线程池的参数配置,为什么Java官方提供工厂方法给线程池?

 1、线程池简介:

Java面试题(每天10题)-------连载(31)_第1张图片

2、核心参数:

Java面试题(每天10题)-------连载(31)_第2张图片

3 、⼯⼚⽅法作⽤: ThreadPoolExecutor 类就是 Executor 的实现类,但 ThreadPoolExecutor 在使⽤上并不是那么⽅便,在实例化时需要传⼊很多歌参数,还要考虑线程的并发数等与线程池运⾏效率有关的参数,所以官⽅建议使⽤Executors ⼯程类来创建线程池对象。

你可能感兴趣的:(java,开发语言)