Java多线程并发面试问答
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」...
每日福利
上一篇: PHP实现Soap通讯的方法
下一篇: 山鸡怎么做好吃又营养,方法秘诀全都告诉你