Java多线程知识点

1.如何让一段程序并发的执行,并最终汇总结果? 

使用CyclicBarrier 在多个关口处将多个线程执行结果汇总,CountDownLatch 在各线程执行完毕后向总线程汇报结果


2.如何合理的配置java线程池?如CPU密集型的任务,基本线程池应该配置多大?IO密集型的任务,基本线程池应该配置多大?用有界队列好还是无界队列好?任务非常多的时候,使用什么阻塞队列能获取最好的吞吐量? 

配置线程池时CPU密集型任务可以少配置线程数,大概和机器的cpu核数相当,可以使得每个线程都在执行任务
IO密集型时,大部分线程都阻塞,故需要多配置线程数,2*cpu核数

有界队列和无界队列的配置需区分业务场景,一般情况下配置有界队列,在一些可能会有爆发性增长的情况下使用无界队列。
任务非常多时,使用非阻塞队列使用cas操作替代锁可以获得好的吞吐量


3.多读少写的场景应该使用哪个并发容器,为什么使用它?比如你做了一个搜索引擎,搜索引擎每次搜索前需要判断搜索关键词是否在黑名单里,黑名单每天更新一次。 

CopyOnWriteArrayList这个容器适用于多读少写…读写并不是在同一个对象上。在写时会大面积复制数组,所以写的性能差,在写完成后将读的引用改为执行写的对象


4.如何实现乐观锁(CAS)?如何避免ABA问题?

读取内存值
比较内存值和期望值
替换内存值为要替换值
带参数版本来避免aba问题,在读取和替换的时候进行判定版本是否一致


5.读写锁可以用于什么应用场景?

 多读少写,读写锁支持多个读操作并发执行,写操作只能由一个线程来操作


6.什么时候应该使用可重入锁?

 重入锁指的是在某一个线程中可以多次获得同一把锁,在线程中多次操作有锁的方法


7.什么场景下可以使用volatile替换synchronized?

只需要保证共享资源的可见性的时候可以使用volatile替代,synchronized保证可操作的原子性一致性和可见性。
volatile适用于新值不依赖于就值的情形。




你可能感兴趣的:(Java多线程知识点)