Java并发面试问答

什么是原子操作?Java并发API中的原子类是什么?

原子操作在单个任务单元中执行,而不受其他操作的干扰。在多线程环境中,原子操作是必需的,以避免数据不一致。

int++不是原子操作。因此,当一个线程读取其值并将其递增1时,另一线程读取了较早的值,从而导致错误的结果。

为了解决这个问题,我们必须确保对count的增量操作是原子的,我们可以使用Synchronization做到这一点,但是Java 5 java.util.concurrent.atomic为int和long提供了包装器类,可用于自动实现此目的不使用同步。

Java并发API中的Lock接口是什么?与同步相比,它有什么好处?

与使用同步方法和同步块相比,Lock接口提供了更广泛的锁定操作。它们允许更灵活的结构,可以具有完全不同的属性,并且可以支持多个关联的Condition对象。
锁的优点是

  • 有可能使它们公平
  • 在等待Lock对象时,可以使线程响应中断。
  • 可以尝试获取锁,但是如果无法获取锁,则立即返回或在超时后返回
  • 可以在不同的范围内以不同的顺序获取和释放锁

什么是Executor框架?

在Java 5中,Executor框架是通过java.util.concurrent.Executor接口引入的。

Executor框架是用于根据一组执行策略对异步任务的调用,调度,执行和控制进行标准化的框架。

创建很多没有最大阈值限制的线程会导致应用程序用尽堆内存。因此,创建ThreadPool是更好的解决方案,因为可以合并和重用有限数量的线程。执行程序框架简化了用Java创建线程池的过程。

什么是BlockingQueue?我们如何使用阻塞队列来实现生产者-消费者问题?

java.util.concurrent.BlockingQueue是一个Queue,它支持以下操作:在检索和删除元素时等待队列变为非空,并在添加元素时等待队列中的空间变为可用。

如果尝试将空值存储在队列中,则BlockingQueue不接受空值并抛出NullPointerException。

BlockingQueue实现是线程安全的。所有排队方法本质上都是原子的,并使用内部锁或其他形式的并发控制。

BlockingQueue接口是Java集合框架的一部分,它主要用于实现生产者-消费者问题。

什么是Callable和Future?

Java 5在并发包中引入了java.util.concurrent.Callable接口,该接口类似于Runnable接口,但是它可以返回任何Object并能够引发Exception。

Callable接口使用泛型定义Object的返回类型。Executors类提供有用的方法来在线程池中执行Callable。由于可调用任务并行运行,因此我们必须等待返回的Object。可调用任务返回java.util.concurrent.Future对象。使用Future,我们可以找出Callable任务的状态并获取返回的Object。它提供了get()方法,可以等待Callable完成,然后返回结果。

什么是FutureTask类?

FutureTask是Future接口的基本实现类,我们可以将其与Executors一起使用以进行异步处理。在大多数情况下,我们不需要使用FutureTask类,但是如果我们要覆盖Future接口的某些方法并希望保留大多数基本实现,它将非常方便。我们可以扩展此类并根据我们的要求覆盖方法。

什么是并发集合类?

Java Collection类是fast-fail的,这意味着如果在使用迭代器遍历某个线程的同时更改了Collection,则iterator.next()将抛出ConcurrentModificationException。

并发集合类支持检索的完全并发性和可调整的预期更新并发性。
主要类是ConcurrentHashMap,CopyOnWriteArrayList和CopyOnWriteArraySet。

什么是Executors类?

Executors类为Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable类提供实用程序方法。

Executors类可用于在Java中轻松创建线程池,这也是唯一支持执行Callable实现的类。

Java 8中的并发API有哪些改进?

一些重要的并发API增强功能包括:

  • ConcurrentHashMapcompute(),forEach(),forEachEntry(),forEachKey(),forEachValue(),merge(),reduce()和search()方法。
  • 可以显式完成的CompletableFuture(设置其值和状态)。
  • 执行程序newWorkStealingPool()方法使用所有可用处理器作为目标并行度来创建窃取线程池。

“不积跬步,无以至千里”,希望未来的你能:有梦为马 随处可栖!加油,少年!

关注公众号:「Java 知己」,每天更新Java知识哦,期待你的到来!

  • 发送「Group」,与 10 万程序员一起进步。
  • 发送「面试」,领取BATJ面试资料、面试视频攻略。
  • 发送「玩转算法」,领取《玩转算法》系列视频教程。
  • 千万不要发送「1024」...


每日福利

Java多线程并发面试问答的更多相关文章

  1. Java 多线程 | 并发知识问答总结

    写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...

  2. Java多线程-并发容器

    Java多线程-并发容器 在Java1.5之后,通过几个并发容器类来改进同步容器类,同步容器类是通过将容器的状态串行访问,从而实现它们的线程安全的,这样做会消弱了并发性,当多个线程并发的竞争容器锁的时 ...

  3. Java 多线程并发编程一览笔录

    Java 多线程并发编程一览笔录 知识体系图: 1.线程是什么? 线程是进程中独立运行的子任务. 2.创建线程的方式 方式一:将类声明为 Thread 的子类.该子类应重写 Thread 类的 run ...

  4. Java多线程并发技术

    Java多线程并发技术 参考文献: http://blog.csdn.net/aboy123/article/details/38307539 http://blog.csdn.net/ghsau/a ...

  5. java 多线程并发问题总结

    java 多线程并发主要通过关键字synchronized实现 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问 ...

  6. 从火箭发场景来学习Java多线程并发闭锁对象

    从火箭发场景来学习Java多线程并发闭锁对象 倒计时器场景 在我们开发过程中,有时候会使用到倒计时计数器.最简单的是:int size = 5; 执行后,size—这种方式来实现.但是在多线程并发的情 ...

  7. Java多线程并发03——在Java中线程是如何调度的

    在前两篇文章中,我们已经了解了关于线程的创建与常用方法等相关知识.接下来就来了解下,当你运行线程时,线程是如何调度的.关注我的公众号「Java面典」了解更多 Java 相关知识点. 多任务系统往往需要 ...

  8. Java多线程并发02——线程的生命周期与常用方法,你都掌握了吗

    在上一章,为大家介绍了线程的一些基础知识,线程的创建与终止.本期将为各位带来线程的生命周期与常用方法.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程生命周期 一个线程不是被创建了 ...

  9. Java多线程并发05——那么多的锁你都了解了吗

    在多线程或高并发情境中,经常会为了保证数据一致性,而引入锁机制,本文将为各位带来有关锁的基本概念讲解.关注我的公众号「Java面典」了解更多 Java 相关知识点. 根据锁的各种特性,可将锁分为以下几 ...

随机推荐

  1. 六、接上一个博客-ITK例子运行结果

    一.程序介绍 该程序的主要思路如下: 二.程序参数 1-程序自己创建三维图像的时候 我自己计算得到的参数如下: 三维图像参数:  旋转参数: 光线投射法参数: 当我们输入参数:  -v 得到程序的输出 ...

  2. (day68)Vue-CLI项目、页面跳转和传参、生命周期钩子

    目录 一.Vue-CLI (一)环境搭建 (二)项目的创建 (三)项目目录结构 (四)Vue组件(.vue文件) (五)全局脚本文件main.js(项目入口) (六)Vue请求生命周期 二.页面跳转和 ...

  3. 网络编程懒人入门(十):一泡尿的时间,快速读懂QUIC协议

    1.TCP协议到底怎么了? 现时的互联网应用中,Web平台(准确地说是基于HTTP及其延伸协议的客户端/服务器应用)的数据传输都基于 TCP 协议. 但TCP 协议在创建连接之前需要进行三次握手(如下 ...

  4. 关于 Comparable 的使用

    作为一名刚上路的超初级程序员,今天终于可以迈开自己的第一步,写一篇博客.把我自己都感动哭了. 今天看面试题时看到了一个Comparable 的使用,才发现自己好像并没有使用过这个接口,具体这个接口是怎 ...

  5. Web开发跨域问题

    什么是域?    协议,  ip(域名). 端口 前端:域  后端:域   js 进行跨域请求, 因为浏览器的同源策略,导致了两个不同域请求出错 浏览器 会尝试向后端发送 option 请求, --- ...

  6. centos7安装服务器之安装禅道

    Centos7下安装禅道 1. 下载禅道的linux版本 我的centos7的版本为:7.7版本 2. 将下载的包上传到centos7服务器上 3. 将禅道压缩包解压到/opt目录下: 4. 启动禅道 ...

  7. 为什么老外不愿意用MyBatis?

    作者:陈龙 www.zhihu.com/question/309662829 Spring 团队的Josh Long自己在Twitter上做了一个调查.1625次投票,样本量不算大,但也能说明问题.和 ...

  8. js获取时间,循环执行任务,延迟执行任务

    一.获取时间 核心方法创建一个时间对象:new Date() 时间对象相关操作 时间对象.函数名 函数名 功能 getYear() 获取四位数的年份 getMonth() 获取2位数的月数, 这个是从 ...

  9. Add a Class from the Business Class Library从业务类库添加类(EF)

    In this lesson, you will learn how to use business classes from the Business Class Library as is. Fo ...

  10. Kafka与RabbitMQ对比

    Infi-chu: http://www.cnblogs.com/Infi-chu/ Kafka是LinkedIn在2012年发布的开源的消息发布订阅系统,他主要用于处理活跃的流式数据.大数据量的数据 ...