互联网Java工程师面试题·Java 并发编程篇·第七弹

news2024/12/26 9:20:08

目录

16、CAS 的问题

17、什么是 Future?

18、什么是 AQS

19、AQS 支持两种同步方式:

20、ReadWriteLock 是什么

21、FutureTask 是什么

22、synchronized 和 ReentrantLock 的区别

23、什么是乐观锁和悲观锁

24、线程 B 怎么知道线程 A 修改了变量

25、synchronized、volatile、CAS 比较

26、sleep 方法和 wait 方法有什么区别?

27、ThreadLocal 是什么?有什么用?

28、为什么 wait()方法和 notify()/notifyAll()方法要在同步块中被调用

29、多线程同步有哪几种方法?

30、线程的调度策略

31、ConcurrentHashMap 的并发度是什么

32、Linux 环境下如何查找哪个线程使用 CPU 最长


16、CAS 的问题

1、CAS 容易造成 ABA 问题

一个线程 a 将数值改成了 b,接着又改成了 a,此时 CAS 认为是没有变化,其实是已经变化过了,而这个问题的解决方案可以使用版本号标识,每操作一次version 加 1。在 java5 中,已经提供了 AtomicStampedReference 来解决问题。

2、不能保证代码块的原子性

CAS 机制所保证的知识一个变量的原子性操作,而不能保证整个代码块的原子性。比如需要保证 3 个变量共同进行原子性的更新,就不得不使用 synchronized 了。

3、CAS 造成 CPU 利用率增加

之前说过了 CAS 里面是一个循环判断的过程,如果线程一直没有获取到状态,cpu资源会一直被占用。


17、什么是 Future?

在并发编程中,我们经常用到非阻塞的模型,在之前的多线程的三种实现中,不管是继承 thread 类还是实现 runnable 接口,都无法保证获取到之前的执行结果。通过实现 Callback 接口,并用 Future 可以来接收多线程的执行结果。Future 表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加Callback 以便在任务执行成功或失败后作出相应的操作。


18、什么是 AQS

AQS 是 AbustactQueuedSynchronizer 的简称,它是一个 Java 提高的底层同步工具类,用一个 int 类型的变量表示同步状态,并提供了一系列的 CAS 操作来管理这个同步状态。

AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的 ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask 等等皆是基于AQS 的。


19、AQS 支持两种同步方式:

1、独占式

2、共享式

这样方便使用者实现不同类型的同步组件,独占式如 ReentrantLock,共享式如Semaphore,CountDownLatch,组合式的如 ReentrantReadWriteLock。总之,AQS 为使用提供了底层支撑,如何组装实现,使用者可以自由发挥。


20、ReadWriteLock 是什么

首先明确一下,不是说 ReentrantLock 不好,只是 ReentrantLock 某些时候有局限。如果使用 ReentrantLock,可能本身是为了防止线程 A 在写数据、线程 B 在读数据造成的数据不一致,但这样,如果线程 C 在读数据、线程 D 也在读数据,读数据是不会改变数据的,没有必要加锁,但是还是加锁了,降低了程序的性能。因为这个,才诞生了读写锁 ReadWriteLock。ReadWriteLock 是一个读写锁接口,ReentrantReadWriteLock 是 ReadWriteLock 接口的一个具体实现,实现了读写的分离,读锁是共享的,写锁是独占的,读和读之间不会互斥,读和写、写和读、写和写之间才会互斥,提升了读写的性能。


21、FutureTask 是什么

这个其实前面有提到过,FutureTask 表示一个异步运算的任务。FutureTask 里面可以传入一个 Callable 的具体实现类,可以对这个异步运算的任务的结果进行等待获取、判断是否已经完成、取消任务等操作。当然,由于 FutureTask 也是Runnable 接口的实现类,所以 FutureTask 也可以放入线程池中。


22、synchronized 和 ReentrantLock 的区别

synchronized 是和 if、else、for、while 一样的关键字,ReentrantLock 是类,这是二者的本质区别。既然 ReentrantLock 是类,那么它就提供了比synchronized 更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量,ReentrantLock 比 synchronized 的扩展性体现在几点上:

1、ReentrantLock 可以对获取锁的等待时间进行设置,这样就避免了死锁

2、ReentrantLock 可以获取各种锁的信息

3、ReentrantLock 可以灵活地实现多路通知

另外,二者的锁机制其实也是不一样的。ReentrantLock 底层调用的是 Unsafe 的park 方法加锁,synchronized 操作的应该是对象头中 mark word,这点我不能确定。


23、什么是乐观锁和悲观锁

1、乐观锁:就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态,乐观锁认为竞争不总是会发生,因此它不需要持有锁,将比较-替换这两个动作作为一个原子操作尝试去修改内存中的变量,如果失败则表示发生冲突,那么就应该有相应的重试逻辑。

2、悲观锁:还是像它的名字一样,对于并发间操作产生的线程安全问题持悲观状态,悲观锁认为竞争总是会发生,因此每次对某资源进行操作时,都会持有一个独占的锁,就像 synchronized,不管三七二十一,直接上了锁就操作资源了。


24、线程 B 怎么知道线程 A 修改了变量

1、volatile 修饰变量

2、synchronized 修饰修改变量的方法

3、wait/notify

4、while 轮询


25、synchronized、volatile、CAS 比较

1、synchronized 是悲观锁,属于抢占式,会引起其他线程阻塞。

2、volatile 提供多线程共享变量可见性和禁止指令重排序优化。

3、CAS 是基于冲突检测的乐观锁(非阻塞)


26、sleep 方法和 wait 方法有什么区别?

这个问题常问,sleep 方法和 wait 方法都可以用来放弃 CPU 一定的时间,不同点在于如果线程持有某个对象的监视器,sleep 方法不会放弃这个对象的监视器,wait 方法会放弃这个对象的监视器


27、ThreadLocal 是什么?有什么用?

ThreadLocal 是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。简单说 ThreadLocal 就是一种以空间换时间的做法,在每个 Thread 里面维护了一个以开地址法实现的 ThreadLocal.ThreadLocalMap,把数据进行隔离,数据不共享,自然就没有线程安全方面的问题了。


28、为什么 wait()方法和 notify()/notifyAll()方法要在同步块中被调用

这是 JDK 强制的,wait()方法和 notify()/notifyAll()方法在调用前都必须先获得对象的锁


29、多线程同步有哪几种方法?

Synchronized 关键字,Lock 锁实现,分布式锁等。


30、线程的调度策略

线程调度器选择优先级最高的线程运行,但是,如果发生以下情况,就会终止线程的运行:

1、线程体中调用了 yield 方法让出了对 cpu 的占用权利

2、线程体中调用了 sleep 方法使线程进入睡眠状态

3、线程由于 IO 操作受到阻塞

4、另外一个更高优先级线程出现

5、在支持时间片的系统中,该线程的时间片用完


31、ConcurrentHashMap 的并发度是什么

ConcurrentHashMap 的并发度就是 segment 的大小,默认为 16,这意味着最多同时可以有 16 条线程操作 ConcurrentHashMap,这也是ConcurrentHashMap 对 Hashtable 的最大优势,任何情况下,Hashtable 能同时有两条线程获取 Hashtable 中的数据吗?


32、Linux 环境下如何查找哪个线程使用 CPU 最长

1、获取项目的 pid,jps 或者 ps -ef | grep java,这个前面有讲过

2、top -H -p pid,顺序不能改变


要想了解更多:

千题千解·Java面试宝典_时光の尘的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1093612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零代码编程:用ChatGPT批量采集bookroo网页上的英文书目列表

bookroo网页上有很多不错的英文图书书目。比如这个关于儿童花样滑冰的书单: https://bookroo.com/explore/books/topics/ice-skating 怎么批量下载下来呢? 这个网页是动态网页,要爬取下来比较麻烦,可以先查看源代码,…

06-使用dockerfile构建nginx、redis镜像

主旨 本文使用上一篇文章中说到的dockerfile方式,分别构建一个nginx,一个redis镜像。 环境 linux环境 docker环境 nginx镜像构建 创建目录,并切换至对应目录: [yunweijialocalhost ~]$ mkdir -pv docker/nginx mkdir: 已创建目录 …

redis 缓存设计

1. 前言 学习redis 缓存,可以是为了技术面试;可以是为了应用实践,在开发设计过程中引入缓存,提高性能。比如常见的面试题: 2. 什么是缓存预热、击穿、穿透和雪崩 2.1 缓存预热 缓存预热就是系统上线后,…

Puppeteer结合测试工具jest使用(四)

Puppeteer结合测试工具jest使用(四) Puppeteer结合测试工具jest使用(四)一、简介二、与jest结合使用,集成到常规测试三、支持其他的几种四、总结 一、简介 Puppeteer是一个提供自动化控制Chrome或Chromium浏览器的Node…

09. 机器学习- 逻辑回归

文章目录 线性回归回顾逻辑回归 Hi,你好。我是茶桁。 上一节课,在结尾的时候咱们预约了这节课一开始对上一节课的内容进行一个回顾,并且预告了这节课内容主要是「逻辑回归」,那我们现在就开始吧。 线性回归回顾 在上一节课中&a…

【Linux】基本指令-入门级文件操作(二)

目录 基本指令 7 cp指令(重要) 8 mv指令(重要) 9 nano指令 10 cat指令 11 echo指令与重定向(重要) 12 more指令 13 less指令 基本指令 7 cp指令(重要) 功能:复…

React高级特性之context

例1&#xff1a; createContext // 跨组件通信Context引入createContext import React, { createContext } from react// App传数据给组件C App -- A -- C// 1. 创建Context对象 const { Provider, Consumer } createContext()function SonA () {return (<div>我是…

分布式存储系统Ceph应用详解

Ceph的应用 一、Ceph 存储池(Pool)1.1 Ceph存储池的基本概念1.2 原理1.3 一个Pool资源池应该包含多少PG数&#xff1f;1.4 Ceph 存储池相关管理命令1.4.1 创建1.4.2 查看1.4.3 修改1.4.4 删除 二、 CephFS文件系统MDS接口三、创建CephFS文件系统MDS接口3.1 服务端操作Step1 在管…

【Java学习之道】线程的概念与作用

引言 今天我们将探索多线程编程的基础概念和作用。对于初学者来说&#xff0c;掌握多线程编程是迈向Java高级技能的重要一步。通过本章的学习&#xff0c;你将了解线程是什么以及它在程序开发中的重要性&#xff0c;为你进一步深入学习和实际工作打下坚实的基础。让我们一起来…

学信息系统项目管理师第4版系列27_项目集管理和项目组合管理

1. 项目集发起人 1.1. 负责承诺将组织的资源应用于项目集&#xff0c;并致力于使项目集取得成功的人 1.2. 典型职责 1.2.1. 为项目集提供资金&#xff0c;确保项目集目标与战略愿景保持一致&#xff1b; 1.2.2. 使效益实现交付 1.2.3. 消除项目集管理与交付的困难和障碍 …

单目3D自动标注

这里介绍两种 1. 基于SAM的点云标注 Seal&#xff1a;是一个多功能的自监督学习框架&#xff0c;能够通过利用视觉基础模型的现成知识和2D-3D的时空约束分割自动驾驶数据集点云 Scalability&#xff1a;可拓展性强&#xff0c;视觉基础模型蒸馏到点云中&#xff0c;避免2D和…

应对互联网用户激增与IP地址短缺的挑战

互联网用户激增 随着互联网技术的飞速发展&#xff0c;互联网已经深刻改变了我们的生活方式和商业模式。无论是个人用户还是企业&#xff0c;都越来越依赖互联网进行沟通、娱乐、工作和学习。这一现象导致了互联网用户数量的快速激增。 IP地址的有限性 然而&#xff0c;与此…

码蹄集2230--square 高精度乘低精度,组合数

有种走法&#xff0c;因为需要向上走m步&#xff0c;向右走n步。 显然分子分母分别算出&#xff0c;再相除不太可能&#xff0c;那么分别求出分子和分母的质因子相乘的形式。分子存入up数组中&#xff0c;分母存入down数组中&#xff0c;数组中的元素对应之差final_数组即代表…

OJ项目——用户的登录拦截,我是如何实现的?

目录 前言 1、关于Session该如何处理 简单session回顾&#xff1a; 回顾session的setAttribute、getAttribute : 项目中如何做&#xff1f; 2、登陆拦截器实现 自定义拦截器&#xff1a; 自定义拦截&#xff1a; 前言 博主之前也有出过一期关于拦截器的&#xff0c;大…

STL容器适配器以及仿函数的简单认识

在学c的过程中&#xff0c;我们必不可少的一大工具就是STL&#xff0c;并且要一定程度的了解STL背后的原理。 今天我们来探讨一下STL中stack和queue的容器适配器&#xff0c;以及priority_queue是什么&#xff0c;以及一点仿函数的知识。1.容器适配器 1). 容器适配器 在我们了…

React添加文件路径时使用@符号代替src目录(非creae-react-app)

在其它项目中看到的可以用符号来代替src目录&#xff0c;那么在自己的react项目中也必须得尝试一下。本人的项目不是通过create-react-app脚手架来创建的&#xff0c;无法使用craco或者的方案来实现。 jsconfig.json配置 用的vscode进行开发&#xff0c;查看项目当中是否存在js…

与HTTP相关的各种协议

TCP/IP TCP/IP协议是目前网络世界“事实上”的标准通信协议&#xff0c;实际上是一系列网络通信协议的统称&#xff0c;其中最核心的两个协议是 TCP和IP&#xff0c;其他的还有 UDP、ICMP、ARP 等等&#xff0c;共同构成了一个复杂但有层次的协议栈。 这个协议栈有四层&#x…

Nginx:动静分离(示意图+配置讲解)

示意图&#xff1a; 动静分离 动静分离是指将动态内容和静态内容分开处理的一种方式。通常&#xff0c;动态内容是指由服务器端处理的&#xff0c;例如动态生成的网页、数据库查询等。静态内容是指不需要经过服务器端处理的&#xff0c;例如图片、CSS、JavaScript文件等。通过…

C++之make_unique、namespace、class类总结(二百四十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

React-Router-6学习笔记

一、新建react项目 1、新建项目命令&#xff1a; yarn create vite react-router --template react 2、在vsCode中打开项目 3、在vsCode打开命令终端&#xff0c;输入 yarn 4、执行yarn dev启动当前项目 yarn dev 5、删除多余的东西&#xff0c;保留app.jsx和main.jsx文…