1. 什么是阻塞队列?阻塞队列的实现原理是什么?

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。
这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。
阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。

2. 什么是 Callable 和 Future?

Callable接口类似于 Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而 Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future 可以拿到异步执行任务的返回值。可以认为是带有回调的 Runnable
Future接口表示异步任务,是还没有完成的任务给出的未来结果。所以说 Callable 用于产生结果,Future 用于获取结果。

3. 什么是 FutureTask?

在 Java 并发程序中FutureTask表示一个可以取消的异步运算。它有启动和取消运算、查询运算是否完成和取回运算结果等方法。只有当运算完成的时候结果才能取回,如果运算尚未完成 get方法将会阻塞。一个FutureTask对象可以对调用了 CallableRunnable 的对象进行包装,由于FutureTask也是调用了 Runnable接口所以它可以提交给 Executor 来执行。

4. notify ()和 notifyAll ()有什么区别?

当一个线程进入 wait 之后,就必须等其他线程notify/notifyall,使用 notifyall,可以唤醒所有处于 wait 状态的线程,使其重新进入锁的争夺队列中,而 notify只能唤醒一个。
如果没把握,建议notifyAll,防止notify因为信号丢失而造成程序异常。

5. 什么是可重入锁( ReentrantLock )?谈谈它的实现

线程可以重复进入任何一个它已经拥有的锁所同步着的代码块,synchronized、ReentrantLock都是可重入的锁。在实现上,就是线程每次获取锁时判定如果获得锁的线程是它自己时,简单将计数器累积即可,每 释放一次锁,进行计数器累减,直到计算器归零,表示线程已经彻底释放锁。

6. 乐观锁和悲观锁的理解及如何实现,有哪些实现方式?

悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。Java里面的同步原语synchronized关键字的实现是悲观锁。
乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。在Java中原子变量类就是使用了乐观锁的一种实现方式 CAS 实现的。
乐观锁的实现方式:

使用版本标识来确定读到的数据与提交时的数据是否一致。提交后修改版本标识,不一致时可以采取丢弃和再次尝试的策略。
java 中的 Compare and Swap 即 CAS ,当多个线程尝试使用 CAS 同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。Java开发交流君样:756584822

7. 什么是 CAS 操作,缺点是什么?

CAS 的基本思路就是,如果这个地址上的值和期望的值相等,则给其赋予新值,否则不做任何事儿,但是要返回原值是多少。每一个 CAS 操作过程都包含三个运算符:一个内存地址 V,一个期望的值 A 和一个新值 B,操作的时候如果这个地址上存放的值等于这个期望的值 A,则将地址上的值赋为新值 B,否则不做任何操作。
CAS 缺点

ABA 问题

比如说一个线程one从内存位置V中取出A,这时候另一个线程two也从内存中取出 A,并且two进行了一些操作变成了 B,然后 two又将V位置的数据变成A,这时候线程 one进行 CAS操作发现内存中仍然是 A然后one操作成功。尽管线程 one 的 CAS 操作成功,但可能存在潜藏的问题。从 Java1.5开始J DK 的 atomic包里提供了一个类 AtomicStampedReference 来解决 ABA 问题。
循环时间长开销大:
对于资源竞争严重(线程冲突严重)的情况,CAS自旋的概率会比较大,从而浪费更多的 CPU 资源,效率低于 synchronized

只能保证一个共享变量的原子操作:

当对一个共享变量执行操作时,我们可以使用循环 CAS 的方式来保证原子操作,但是对多个共享变量操作时,循环 CAS 就无法保证操作的原子性,这个时候就可以用锁。

8. SynchronizedMap 和 ConcurrentHashMap 有什么区别?

1. Executor框架是一个根据一组执行策略调用,调度,执行和控制的异步任务的框架。每次执行任务创建线程 new
Thread()比较消耗性能,创建一个线程是比较耗时、耗资源的。
2. 调用 new
Thread()创建的线程缺乏管理,而且可以无限制的创建,线程之间的相互竞争会导致过多占用系统资源而导致系统瘫痪,还有线程之间的频繁交替也会消耗很多系统资源。

接使用 new Thread()启动的线程不利于扩展,比如定时执行、定期执行、定时定期执行、线程中断等都不便实现。

9. 在 Java 中 wait 和 sleep 方法的不同?

最大的不同是在等待时 wait 会释放锁,而 sleep 一直持有锁。Wait 通常被用于线程间交互,sleep 通常被用于暂停执行。

10. 一个线程运行时发生异常会怎样?

如果异常没有被捕获该线程将会停止执行。Thread.UncaughtExceptionHandler是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口。当一个未捕获异常将造成线程中断的时候 JVM 会使用 Thread.getUncaughtExceptionHandler ( ) 来查询线程的UncaughtExceptionHandler并将线程和异常作为参数传递给handleruncaughtException()方法进行处理。

最后,祝大家早日学有所成,拿到满意offer

求职学习笔记|并发编程知识点常见问题总结(一)相关推荐

  1. java task和thread_【Java学习笔记-并发编程】线程与任务

    前言 最近在看一些Java15的并发.线程调度以及一些实现方案的东西,虽然很多东西还是 1.5 的,但还是很有收获. 一.线程与任务 Java中,要用线程来执行任务,线程可以说是任务的容器.没有线程的 ...

  2. go语言学习笔记 — 并发编程 — 通道channel(3):各种各样的通道

    3.1 单向通道 在声明通道时,我们可以设置只发送或只接收.这种被约束操作方向的通道称为单向通道. 声明单向通道 只发送:chan<-,只接收:<-chan var 通道实例 chan&l ...

  3. java 并发编程视频教程_全面深入学习java并发编程,视频教程下载

    课程目标: * 颠覆一些你以为"正确"的认知,纠正其它同类视频的错误 * 100+ 张手绘图 & 流程图,帮助你形成正确的"多线程世界观" * 以知识点 ...

  4. ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)...

    ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程) ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在dee ...

  5. python学习笔记——多线程编程

    python学习笔记--多线程编程 基础不必多讲,还是直接进入python. Python代码代码的执行由python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时 ...

  6. 如何学习Java并发编程

    只要从事JAVA开发的小伙伴们,都会或多或少地接触到并发编程.对于初学者来说,这一部分内容比较晦涩难懂,并且嵌入了很多新技术.本篇博文旨在为小伙伴们提供学习Java并发编程的指导性建议.当然,这仅仅是 ...

  7. 学习笔记之编程达到一个高的境界就是自制脚本语言(图)

    学习笔记之编程达到一个高的境界就是自制脚本语言(图) 编程达到一个高的境界就是自制脚本语言,通过这可以精通编程里面的高深的技术,如编译原理.语言处理器.编译器与解释器,这些都是代表一个程序员实力的技术 ...

  8. 《密码编码学与网络安全》William Stalling著---学习笔记(二)【知识点速过】【数字签名+密钥管理分发+用户认证】

    提示:博文有点长,请保持耐心哦~ 前一篇文章: <密码编码学与网络安全>William Stalling著-学习笔记(一)[知识点速过][传统密码+经典对称加密算法+经典公钥密码算法+密码 ...

  9. 《密码编码学与网络安全》William Stalling著---学习笔记(三)【知识点速过】【网络安全与Internet安全概览】

    提示:博文有点长,请保持耐心哦~ 前两篇文章: <密码编码学与网络安全>William Stalling著-学习笔记(一)[知识点速过][传统密码+经典对称加密算法+经典公钥密码算法+密码 ...

最新文章

  1. LLVM语法语义指令特性
  2. 关于微信小程序登录授权
  3. 增加行星轮减速后机械臂调试
  4. 正则表达式原理及引擎实现
  5. python爬虫招聘-Python爬虫抓取智联招聘(基础版)
  6. BZOJ4001[TJOI2015]概率论——卡特兰数
  7. 图像缩放算法_opencv缩放算法
  8. 零基础学Python(第十六章 函数·重点)
  9. MVP on Board 没用小技巧
  10. 计算机辅助设计的概念.doc,计算机辅助设计的基础知识.DOC
  11. echart 高度 不用 不撑满_你担心的高度近视老了之后是这样的
  12. java多维数组的反射类型_Java多维数组和Arrays类方法总结详解
  13. HLG 1334 最好的心情[lis 变形]
  14. 【C/C++】拷贝构造函数 赋值运算符的重载
  15. iOS:懒加载符号绑定流程
  16. 国家软考--高级系统分析师证书
  17. 如何把map的value转为list_Java 8 将Map转换为List
  18. win10输入法变成繁体字的快捷键
  19. 如何搭建DHCP服务器及自动获取IP地址及相关操作
  20. Vue watch 监听复杂对象变化,oldvalue 和 newValue 一致的解决办法。

热门文章

  1. Asp.Net Core 快速邮件队列设计与实现
  2. C#语法——await与async的正确打开方式
  3. VS2017 15.8第二个预览版本提升了对CPU Profiling和F#的支持
  4. Apache SkyWalking 为.NET Core带来开箱即用的分布式追踪和应用性能监控
  5. 限时团购,6.9折:《微信开发深度解析:公众号、小程序高效开发秘籍》推荐序
  6. IdentityServer4 指定角色授权(Authorize(Roles=amp;quot;adminamp;quot;))
  7. asp.net core中负载均衡场景下http重定向https的问题
  8. Visual Studio 2017发布会:黄金时代的家族聚会
  9. ASP.NET CORE 项目实战 ---图形验证码的实现
  10. 程序员小测试:保守派 vs 自由派