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…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
