在之前的文章中,已经发布了常见的面试题,这里我花了点时间整理了一下对应的解答,由于个人能力有限,不一定完全到位,如果有解答的不合理的地方还请指点,在此谢过。
本文主要描述的是java多线程中提供的一些常用框架atomic、阻塞队列、并行流。原子类在某些场景下能够提高性能,避免使用锁。阻塞队列完成的是生产者消费者模型,这个在很多场景会使用到,包括线程池里面的一个重要参数就是阻塞队列。并行流结合lambda表达式能够改变我们的平时代码风格,但要注意的是需要关注一下线程安全问题。如果对java多线程感兴趣的同学可以看下公众号里多线程系列的文章,也许会对你有些帮助。
Atomic包中的内容有了解过,atomicinteger 和atomicintegerFiledUpdater 的区别是什么?
在java语言中,提供了atomic包,这个包中主要实现的是对数据原子类操作,其中的基础数据类型包含整型、布尔型、长整型、引用;数组类型包含整型数组、长整型数组、引用数组;更新器类型包含整型、长整型、引用。在这里面的绝大部分原子性操作都是通过CAS(compare and swap)来实现的。AtomicInteger 是基本数据更新器,我们直接在类中定义一个原子整型,后续的操作是对这个原子整型的操作。而AtomicIntegerFiledUpdater则是在一个model中定义一个整型,该整型不是原子整型,但是可以通过原子更新器每次原子更新该字段。为了更清晰的说明两个的使用方式,我们通过下面的例子来说明一下。
AtomicInteger:直接定义一个原子整型类进行使用。
public class AtomicIntegerTest {
public static void main(String[] args) {
AtomicInteger integer = new AtomicInteger(0);//创建一个原子整型
for (int i =0;i<100;i++){
new Thread(new AddTest(integer)).start();
}
}
private static class AddTest implements Runnable{
private AtomicInteger data ;
public AddTest(AtomicInteger a) {
this.data = a;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" get data i