建议:

  • 学习java并发前需要先掌握JVM知识
  • 关于下面问题档案的详细解析都在后面推荐的相关系列文章中

一、线程安全相关

1、什么叫线程安全?

线程安全就是说多线程访问同一代码,不会产生不确定的结果。

2、为什么会存在线程安全的问题?

  • 共享性:多个线程操作同一个类实例时,类属性是共享的。
  • 互斥性:为保证数据安全性,同一时刻只有一个线程可以修改数据

3、如何保证线程安全?

  • 原子性:针对代码块
  • 可见性:数据从线程工作内存刷新到JVM主存中这个动作必须是同步的
  • 有序性:指令重排,操作系统对指令进行重排序时只保证单线程时最终结果的正确性,不能保证多线程情况下最终结果的正确性

4、同步有几种实现方法?(或者问Java 程序中怎么保证多线程的运行安全?)

JDK内置的syncchronized关键字、共享变量(volatile)实现线程同步、JUC的可重入锁ReentrantLock类、使用局部变量实现线程同步

5、volatile关键字有什么作用?弊端是什么?适用场景是什么?

1)作用:通过volatile关键字可以保证变量的可见性和有序性,但不能保证原子性

  • 可见性:变量修改被立即刷新到主存中;变量读取不能从工作内存读取,必须从主存读取。(通过硬件锁保证线程安全的)
  • 有序性:volatile变量前的代码不能重排到volatile变量后,volatile变量后的代码也不能重排到volatile变量前。

2)弊端

  • 原子性:i++操作是非线程安全的,即使通过volatile关键字修饰也不能保证其原子性

3)适用场景

6、volatile与synchronized区别是什么?什么场景下可以使用volatile替换synchronized?

volatile只能保证可见性和有序性,synchronized可以保证原子性、可见性、有序性

  • 状态标志:把简单地volatile变量作为状态标志,来达成线程之间通讯的目的,省去了用synchronized还要wait、notify或者interrupt的编码麻烦。
  • 替换重量级锁:如果某个变量仅是单次读或者单次写操作,没有复合操作(i++,先检查后判断之类的)就可以用volatile替换synchronized。

二、CAS相关

1、CAS是什么

CAS是乐观锁思想的一种实现方式,也是无锁保证变量线程安全的一种方式。原理是将变量的新值写入主存前,需要比较工作内存中的旧值和主存中的旧值是否相等(相等说明主存中的变量没有被其他线程修改过),相等则将新值写入主存中。

2、ABA问题

比如说一个线程one从内存位置V取出value_A,这时候另一个线程two也从内存中取出value_A,并且线程two进行了一些操作变成了value_B,然后two又将V位置的数据变成value_A,这时候线程one进行CAS操作发现内存中仍然是A,然后one操作成功。尽管线程one的CAS操作成功,但是不代表这个过程就是没有问题的。解决方法:通过版本号(version)的方式来解决,每次比较要比较数据的值和版本号两项内容即可。

3、atomic 的原理?

三、锁的种类

1、分类

  • 乐观锁/悲观锁:假设每次操作都不会冲突,若是遇到冲突失败就重试直到成功;悲观锁是让其他线程都等待,等锁释放完了再竞争锁。
  • 共享锁/独占锁:也叫读写锁/互斥锁
  • 公平锁/非公平锁
  • 可重入锁:线程可以进入任何一个它持有锁的线程
  • 自旋锁
  • 自适应自旋锁
  • 无锁/偏向锁/轻量级锁/重量级锁

2、乐观锁/悲观锁实现方式?

  • 乐观锁实现方式:cas,volatile
  • 悲观锁实现方式:synchronized,Lock

3、读写锁可以用于什么场景?

适用于少写多读的情况,互斥锁效率低,而多线程都是读的情况不需要互斥,只有读-写、写-写冲突时才需要互斥,通过读写锁可以提高效率,具体工具类是ReentrantReadWriteLock

4、什么时候应该使用可重入锁?

可重入锁指的是同一线程外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,ReentrantLock 和synchronized都是可重入锁,所以大部分情况下使用的都是可重入锁

5、锁的4种状态以及膨胀过程

膨胀方向:无锁 → 偏向锁 → 轻量级锁 → 重量级锁(只能单向膨胀,不能逆膨胀)

膨胀原因:多线程竞争加剧,导致锁升级

6、什么是死锁? 怎么防止死锁?

三、Synchoronied

1、Synchoronied是什么?

关键词:重量级锁、悲观锁、互斥锁、

2、使用方法

用于修饰普通函数、静态函数、代码块

3、底层原理:

通过底层cpu的monitorenter和monitorexit对线程的出入进行控制

4、优化:

轻量级锁、偏向锁

5、当一个线程进入某个对象的一个synchronized的实例方法后,其它线程是否可进入此对象的其它方法?

  • 如果其他方法前加了synchronized关键字,就不能,如果没加synchronized,则能够进去。因为一个对象只有一个monitor锁,当一个线程进入synchronized的实例方法后便获得了当前对象的monitor锁,其他线程由于无法获得monitor锁,所以无法进入此对象的其它被synchronized修饰的方法。
  • 如果这个方法内部调用了wait(),则释放了monitor锁,则可以进入其他加synchronized的方法。如果其他方法加了synchronized关键字,并且没有调用wai方法,则不能。

四、Lock类

1、底层原理:

依赖于AQS

2、AQS原理?

关键词:juc包的Lock类的基石

数据结构:带有头尾指针的双向链表,节点Node中包含头指针、尾指针、抢占状态3个重要的属性

作用:实现线程的抢锁、释放锁、排队等待、阻塞唤醒等操作

3、Lock锁、ReentrantLock、ReentrantWriteReadLock、LockSupport?

4、CountDownLatch、CyclicBarrier 、Semaphore?

5、wait/notify()/notifyAll()、await()/signal/signalAll区别?

6、synchronized和java.util.concurrent.locks.Lock的异同?

  • 主要相同点:Lock能完成Synchronized所实现的所有功能。
  • 主要不同点:

五、多线程操作相关

1、并行和并发有什么区别?

2、线程和进程的区别?

3、 守护线程是什么?

4、创建线程有哪几种方式?

5、说一下 runnable 和 callable 有什么区别?

6、线程有哪些状态?

7、 sleep() 和 wait() 有什么区别?

8、notify()和 notifyAll()有什么区别?

9、 线程的 run() 和 start() 有什么区别?

10、创建线程池有哪几种方式?

11、线程池都有哪些状态?

12、线程池中 submit() 和 execute() 方法有什么区别?

13. ThreadLocal 是什么?有哪些使用场景?

六、并发编程实战

1、如何实现一个流控程序,用于控制请求的调用次数?

答案参考:Java并发编程—实战

Java并发编程系列文章:

  • Java 并发编程—核心理论
  • Java并发编程—volatile关键字(保证变量的可见性、有序性机制)
  • Java并发编程—无锁互斥机制及CAS原理
  • Java并发编程—锁的基本概念
  • Java 并发编程—Synchronized关键字
  • Java并发编程—Synchronized底层优化(偏向锁、轻量级锁)
  • Java 并发编程—有锁互斥机制及AQS理论
  • Java并发编程—AQS原理分析
  • Java并发编程—自旋锁CLHLock、MCSLock原理
  • Java并发编程—JUC的Lock锁
  • Java并发编程—线程同步类
  • Java并发编程—线程间协作方式wait()、notify()、notifyAll()和Condition
  • Java并发编程—为什么 wait() 方法需要写在 while 里,而不是 if?

Java并发编程—常见面试题相关推荐

  1. 总结并发编程常见面试题

    Hello,你好呀,我是大白(●-●) 目录标题 并发编程常见面试题 并发编程常见面试题 在Java中守护线程和用户线程的区别? 线程与进程的区别 什么是多线程中的上下文切换 死锁与活锁的区别,死锁与 ...

  2. 【搞定 Java 并发面试】面试最常问的 Java 并发进阶常见面试题总结!

    本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习 面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.觉得内容不错 ...

  3. 并发编程常见面试题Synchronized 相 关 问 题

    Synchronized 相 关 问 题 问 题 一 : Synchronized 用 过 吗 , 其 原 理 是 什 么? 这 是 一 道 Java 面 试 中 几 乎 百 分 百 会 问 到 的 ...

  4. java中级程序员面试题_中级Java程序员常见面试题汇总

    下面是一些中级Java程序员常见面试题汇总,你可以用它来好好准备面试. 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器 ...

  5. 「java工程师」常见面试题及其答案(持续更新)

    「高级java工程师」常见面试题及其答案: 「高级java工程师」常见面试题及其答案(持续更新)_好人老李的博客-CSDN博客 目录 java基础 面向对象与面向过程的区别? JRE.JDK.JVM的 ...

  6. Java后端工程师常见面试题

    以下是整理的Java后端工程师常见面试题,希望有助于找工作: 1,对Java集合框架的理解.ArrayList和LinkedList的区别和优缺点,以及使用场景.扩容因子了解吗?分别是多少. Java ...

  7. java线程池面试题有哪些?java线程池常见面试题

    进行java面试的过程中,java线程池是必问的面试题目,因为这是java的重点知识,也是在java工作中经常会遇到的,那java线程池面试题有哪些?下面来我们就来给大家讲解一下java线程池常见面试 ...

  8. 「高级java工程师」常见面试题及其答案(持续更新)

    「java工程师」常见面试题及其答案请见: 「java工程师」常见面试题及其答案(持续更新)_好人老李的博客-CSDN博客 目录 java基础 常用的 jvm 调优方法? OOM的常见场景及其原因.解 ...

  9. java 并发 面试_Java 并发基础常见面试题总结

    1. 什么是线程和进程? 1.1. 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序即是一个进程从创建,运行到消亡的过程. 在 Java 中,当我们启 ...

最新文章

  1. 使用Python和OpenCV检测图片上的条形码
  2. Daily scrum[2013.11.28]
  3. .Net资讯 | 一大波开发者福利来了, 一份微软官方Github上发布的开源项目清单等你签收...
  4. egg直接取req_Egg服务器基础功能
  5. UVA455 - Periodic Strings(周期串)
  6. 每周荐书:ES6、虚拟现实、物联网(评论送书)
  7. [Vue] : Vue实例的声明周期
  8. notepad++弹出菜单
  9. 如何卸载2345soft文件夹
  10. R语言:多因素Cox回归森林图 (基于forestplot包) 森林图 cox可视化
  11. openv-p-n服务端安装
  12. mac通过u盘启动linux系统,在mac下制作linux启动U盘
  13. java中 @ExcelField 的使用
  14. html英文颜色大全,html英文颜色名称全集
  15. 什么是Kurento
  16. (阿里offer)春招知识点总结1:java基础+集合+并发+jvm+ssm
  17. Android性能优化之内存优化 1
  18. 盘点2021年流行报表开发工具【测评】
  19. 华为开源构建工具_构建开源软件长达5年并以故事为生
  20. 从概念到安全实践:软件供应链基础指南

热门文章

  1. asp.net常用函数 选择自 UAM_Richard 的 Blog
  2. android Animator详解
  3. linux -- supervitord怎么杀出主进程派生出来的子进程。
  4. 六. 异常处理9.finally块
  5. POJ 1655 Balancing Act (树的重心)
  6. 2016-08-24
  7. openfire推送离线聊天信息的插件
  8. The Tao to Excellent
  9. win7乱码 字符集解决方案
  10. 千山独行-一个人的创业路(连载五)