Java面试记录
文章目录
- 1、final关键字
- 2、synchronized关键字
- (1)synchronized的功能:
- (2)synchronized的底层实现原理:
- 3、Java中线程同步的实现方法
- (1). 使用synchronized关键字:
- (2). 使用Lock接口:
- (3). 使用volatile关键字:
- (4). 使用wait()和notify()/notifyAll()方法:
- 4、ReentrantLock
- 概念:
- 功能:
- 实现:
- 原理:
- 与synchronized的异同:
- 5、volatile关键字
- 概念:
- 功能:
- 实现原理:
- 与synchronized的异同:
1、final关键字
它可以用来修饰类、方法和变量。
-
修饰类:
- 当一个类被final修饰时,它表示该类不能被继承,即它是最终的类,不能有子类。
-
修饰方法:
- 当一个方法被final修饰时,它表示该方法不能被子类重写,即它是最终的方法,子类无法修改它的实现。
-
修饰变量:
- 当一个变量被final修饰时,它表示该变量的值不能被修改,即它是一个常量。被final修饰的变量必须在声明时进行初始化,并且不能再次赋值。
在Java中,synchronized是一个关键字,它用于实现多线程的同步。它可以用来修饰方法或代码块,在多线程环境下确保共享资源的安全访问。
- 当一个变量被final修饰时,它表示该变量的值不能被修改,即它是一个常量。被final修饰的变量必须在声明时进行初始化,并且不能再次赋值。
2、synchronized关键字
它可以用来修饰类、方法和变量。
(1)synchronized的功能:
- 保证线程安全:synchronized关键字可以保证在同一时间只有一个线程可以执行被synchronized修饰的方法或代码块,从而避免多线程同时对共享资源进行修改而产生的数据不一致问题。
(2)synchronized的底层实现原理:
在Java中,synchronized关键字的底层实现主要依赖于对象的监视器锁(也称为内置锁或管程)。
-
对象的监视器锁:每个对象都有一个与之关联的监视器锁,当一个线程访问一个synchronized方法或代码块时,它会自动获得该对象的监视器锁;其他线程必须等待该线程释放锁后才能访问。
-
互斥性:synchronized保证了同一时间只有一个线程可以获得对象的监视器锁,其他线程必须等待,实现了互斥性,避免了多线程同时访问共享资源的问题。
-
可重入性:同一个线程可以多次获得同一个对象的监视器锁,synchronized关键字对重入锁提供了支持,避免了死锁的发生。
需要注意的是,synchronized关键字只能保证同一个对象的同步,不同对象之间的同步需要其他机制(例如使用Lock接口)来实现。此外,synchronized关键字的使用会带来性能的一定损耗,因此在设计多线程应用程序时,需要合理使用synchronized来保证线程安全,同时尽量避免不必要的同步。
3、Java中线程同步的实现方法
有以下几种:
(1). 使用synchronized关键字:
synchronized关键字可以修饰方法或代码块,保证同一时间只有一个线程可以执行被synchronized修饰的方法或代码块。这样可以确保共享资源的安全访问。
(2). 使用Lock接口:
Java提供了Lock接口及其实现类,如ReentrantLock,可以手动控制线程的同步。使用Lock接口可以实现更灵活的线程同步,可以实现公平锁和非公平锁,并提供了更多的功能,如可重入性、条件变量等。
(3). 使用volatile关键字:
volatile关键字可以保证被修饰的变量在多线程环境下的可见性,即一个线程对volatile变量的修改对其他线程是可见的。但是volatile不能保证原子性,无法解决复合操作的线程安全问题。
(4). 使用wait()和notify()/notifyAll()方法:
这两个方法是Object类中的方法,用于实现线程之间的协作。wait()方法使当前线程等待,直到其他线程调用notify()或notifyAll()方法唤醒它;notify()方法唤醒一个等待的线程;notifyAll()方法唤醒所有等待的线程。
以上方法都可以实现线程同步,但根据具体的需求和场景选择合适的方法。
4、ReentrantLock
是Java.util.concurrent包中的一个实现了Lock接口的类,它提供了一种可重入的互斥锁。下面对ReentrantLock进行详细介绍:
概念:
ReentrantLock是一个可重入的互斥锁,它允许线程重复获取同一个锁。与synchronized相比,ReentrantLock提供了更多的灵活性和功能。
功能:
- 互斥性:同一时间只有一个线程可以获取到锁。
- 可重入性:线程可以多次获取同一个锁,不会造成死锁。
- 公平性:可以选择公平锁或非公平锁。公平锁按照线程的申请顺序获取锁,而非公平锁不保证线程获取锁的先后顺序。
- 中断响应性:支持线程的中断响应,即当一个线程等待获取锁时,可以通过中断该线程来使其放弃等待。
- 条件变量:提供了Condition接口,可以通过条件变量实现线程的等待和唤醒机制。
实现:
ReentrantLock的实现是基于AQS(AbstractQueuedSynchronizer)的,它使用一个FIFO的等待队列来管理线程的等待和唤醒。
原理:
知识跳转(AQS和CAS)
- ReentrantLock通过CAS(Compare and Swap)操作来实现对锁状态的修改和判断。
- 当一个线程获取锁时,如果锁是空闲状态,它会直接获取到锁;如果锁被其他线程持有,当前线程会进入等待队列。
- 当一个线程释放锁时,会唤醒等待队列中的一个线程来获取锁。
- ReentrantLock内部维护了一个状态变量state,用来记录锁的状态和重入次数。
与synchronized的异同:
异同之处如下:
- ReentrantLock是一个类,而synchronized是Java的关键字。
- ReentrantLock提供了更多的功能,如可重入性、公平性、中断响应性和条件变量等,而synchronized只提供了基本的同步功能。
- ReentrantLock需要手动获取和释放锁,而synchronized由JVM自动管理锁的获取和释放。
- ReentrantLock可以选择公平锁或非公平锁,而synchronized只能使用非公平锁。
- ReentrantLock的性能相对较好,但使用时需要注意手动释放锁,否则可能导致死锁。synchronized的性能相对较低,但使用更简单,且能自动释放锁。
5、volatile关键字
用于修饰变量。它具有以下特性和功能:
概念:
- 可见性:被volatile修饰的变量对所有线程可见,当一个线程修改了volatile变量的值,其他线程可以立即看到这个变化。
- 禁止指令重排序:volatile关键字禁止编译器和处理器对指令进行重排序,保证了代码的有序性。
功能:
- 在多线程环境下保证变量的可见性。当一个线程修改了volatile变量的值,其他线程可以立即看到这个变化。
- 禁止指令重排序,保证代码的有序性。
实现原理:
- 可见性:在JVM中,volatile关键字通过使用内存屏障(Memory Barrier)来实现可见性。内存屏障会强制刷新处理器缓存并写入主内存,以使得其他线程能够读取最新的值。
- 禁止指令重排序:volatile关键字会限制编译器和处理器对指令进行重排序,保证代码的执行顺序。
与synchronized的异同:
- 相同点:都可以用于多线程环境下的同步,保证共享资源的安全访问。
- 不同点:
- synchronized是重量级锁,会自动进行加锁和释放锁的操作,而volatile只保证可见性和禁止指令重排序。
- synchronized可以修饰方法、代码块和类,而volatile只能修饰变量。
- synchronized可以实现互斥锁,保证同一时间只有一个线程可以执行被修饰的代码块,而volatile不能实现互斥锁。
- synchronized可以解决线程的安全性和有序性问题,而volatile只能解决有序性问题。
相关文章:
Java面试记录
文章目录 1、final关键字2、synchronized关键字(1)synchronized的功能:(2)synchronized的底层实现原理: 3、Java中线程同步的实现方法(1). 使用synchronized关键字:&…...
【数据库】聚集函数
聚集函数 聚集函数一览AVG() 函数COUNT() 函数MAX() 函数MIN() 函数SUM() 函数 组合聚集函数 聚集函数一览 我们需要汇总数据而不是实际检索,此时我们使用聚集函数进行处理; 聚集函数一览表如下: 函数说明AVG()返回平均值COUNT()返回数量总…...
【单元测试】--编写单元测试
一、编写第一个单元测试 编写第一个单元测试通常包括以下步骤。以下示例以C#和NUnit为例: 创建测试项目: 在Visual Studio中,创建一个新的Class Library项目,这将是你的单元测试项目。在解决方案资源管理器中,右键点…...
ES(elasticsearch) - 三种姿势进行分页查询
1. from size 浅分页 "浅"分页可以理解为简单意义上的分页。它的原理很简单,就是查询前20条数据,然后截断前10条,只返回10-20的数据。这样其实白白浪费了前10条的查询。 GET test_dev/_search {"query": {"bool&…...
AQS是什么?AbstractQueuedSynchronizer之AQS原理及源码深度分析
文章目录 一、AQS概述1、什么是AQS2、技术解释3、基本原理4、AQS为什么这么重要 二、AQS数据结构1、AQS的结构2、ReentrantLock与AbstractQueuedSynchronizer3、AQS的state变量4、AQS的队列5、AQS的Node(1)Node的waitStatus(2)属性…...
【数据库】函数处理(文本处理函数、日期和时间处理函数、数值处理函数)
函数处理数据 算术运算函数文本处理函数日期和时间处理函数数值处理函数 算术运算 操作符说明加-减*乘/除 e . g . e.g. e.g. 列出 Orders 表中所有每项物品的 id,数量 quantity,单价 item_price,总价 expanded_price(数量 * 单价…...
GEE案例——一个完整的火灾监测案例dNBR差异化归一化烧毁指数
差异化归一化烧毁指数 dNBR是"差异化归一化烧毁指数"的缩写。它是一种用于评估卫星图像中烧毁区域严重程度的遥感指数。dNBR值通过将火灾前的归一化烧毁指数(NBR)减去火灾后的NBR来计算得出。该指数常用于野火监测和评估。 dNBR(差异化归一化烧毁指数)是一种用…...
计算机算法分析与设计(20)---回溯法(0-1背包问题)
文章目录 1. 题目描述2. 算法思路3. 例题分析4. 代码编写 1. 题目描述 对于给定的 n n n 个物品,第 i i i 个物品的重量为 W i W_i Wi,价值为 V i V_i Vi,对于一个最多能装重量 c c c 的背包,应该如何选择放入包中的物品…...
什么是IO多路复用?Redis中对于IO多路复用的应用?
IO多路复用是一种高效的IO处理方式,它允许一个进程同时监控多个文件描述符(包括套接字、管道等),并在有数据可读或可写时进行相应的处理。这种机制可以大大提高系统的并发处理能力,减少资源的占用和浪费。 在Redis中&…...
NanoPC-T4 RK3399:DTS之io-domain,FAN
前言: 之后所有改动均是基于rk3399-evb.dts修改以满足NanoPC-T4功能正常。 NanoPC-T4开发板上有一片散热风扇,本章将讲述使风扇正常工作起来的多种方法。 一:硬件分析 GPIO4_C6/PWM1:实际控制风扇引脚,GPIO与PWM复用 输入高电平1:FAN2pin电路导通,风扇转动 输入低电…...
vue3+vite+ts项目使用jQuery
1、安装jQuery npm install --save jquery 2、安装声明文件 npm install --save types/jquery 3、在需要的文件中引入 import $ from jquery...
一起学数据结构(10)——排序
从本文开始,通过若干篇文章展开对于数据结构中——排序的介绍。 1. 排序的概念: 将一堆杂乱无章的数据,通过一定的规律顺序排列起来。即将一个无序序列排列成一个有序序(由小到大或者由大到小)的运算。 在数据的排序中…...
php 数组基础/练习
数组 练习在最后 数组概述 概述与定义 数组中存储键值对 数组实际上是一个有序映射 key-value,可将其当成真正的数组、列表(向量)、散列表、字典、集合、栈、队列等 数组中的元素可以是任意类型的数据对象(可以嵌套数组&#…...
Redbook Chapter 7: Query Optimization翻译批注
首先说明一下redbook上的几篇文章是做什么的。这几篇文章是通过几位作者对不同方面的论文进行阅读和筛选后,挑出其中具备代表性或者权威的论文来做分析,为读者提供阅读指导和建议,同时,也是对某个方面的论文进行高度的总结&#x…...
【分布式】大模型分布式训练入门与实践 - 04
大模型分布式训练 数据并行-Distributed Data Parallel1.1 背景1.2 PyTorch DDP1) DDP训练流程2)DistributedSampler3)DataLoader: Parallelizing data loading4)Data-parallel(DP)5)DDP原理解析…...
欧拉图相关的生成与计数问题探究
最近学了一波国家集训队2018论文的最后一个专题。顺便带上了一些我的注解。 先放一波这个论文 1.基本概念 欧拉图问题是图论中的一类特殊的问题。在本文的介绍过程中,我们将会使用一些图 论术语。为了使本文叙述准确,本节将给出一些术语的定义。 定义…...
CSS3属性详解(一)文本 盒模型中的 box-ssize 属性 处理兼容性问题:私有前缀 边框 背景属性 渐变 前端开发入门笔记(七)
CSS3是用于为HTML文档添加样式和布局的最新版本的层叠样式表(Cascading Style Sheets)。下面是一些常用的CSS3属性及其详细解释: border-radius:设置元素的边框圆角的半径。可以使用四个值设置四个不同的圆角半径,也可…...
小程序:如何合理规划分包使主包不超过2M
背景 做过小程序项目的同学应该都有这样的经历,项目做着做着,突然发现代码包的大小超过了 2M,小程序无法提审,然后痛苦的删文件改代码来减少包大小。 虽然我们也知道小程序给我们提供了分包的功能可以减少主包的大小,…...
迭代器的封装与反向迭代器
一、反向迭代器 在list模拟实现的过程中,第一次接触了迭代器的封装,将list的指针封装成了一个新的类型,并且以迭代器的基本功能对其进行了运算符重载 反向迭代器是对正向迭代器的封装,并且体现了泛型编程的思想,任意…...
PHP项目学习笔记-萤火商城https://www.yiovo.com/doc
萤火商城学习笔记 注意事项关于建表增加页面流程前台页面的数据列表数据下拉列表的数据 关于时间的处理前台界面数据处理 多年没有碰过php代码了,这个项目不错,想好好学习下,持续更新 注意事项 打开APP_DEBUG有些时候改了前台页面后&#x…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
