当前位置: 首页 > news >正文

复习之 java 锁

裁员在家,没有面试机会,整理整理面试知识点吧!

不得不知道的java 锁

Java 中,提供了两种方式来实现同步互斥访问(也就是锁):synchronized 和 Lock

多线程编程中,有可能会出现多个线程同时访问同一个共享、可变资源的情况,这个资源我们称之其为临界资源;

这种资源可能是: 对象、变量、文件等。
共享:资源可以由多个线程同时访问
可变:资源可以在其生命周期内被修改
当多个线程执行一个方法时,该方法内部的局部变量并不是临界资源,因为这些局部变量是在每个线程的 ,私有栈中,因此不具有共享性,不会导致线程安全问题。
synchronized
jvm 内置的锁,可以对临界资源同步访问,是可重入的。
实例方法加锁:锁的是当前对象。同一个线程

静态方法加锁:锁的是当前类对象

静态代码块:锁的是代码块里的对象

synchronized底层原理
synchronized 是基于JVM 的内置锁,底层通过通过内部Monitor(监视器锁)实现,监视器锁的实现依赖底层操作系统的Mutex lock(互斥锁)实现,它是一个重量级锁性能较低。jdk1.5 以后哦哦进行了优化。偏向锁,轻量级锁(自适应自旋锁),重量级锁。使得synchronized 性能跟Lock 差不多。 
synchronized关键字被编译成字节码后会被翻译成 monitorenter monitorexit 两条指令分别在同步块逻辑代码的起始位置
与结束位置。
对象结构
一个对象包括:对象头,对象数据,对其填充
对象头包括:
      markworld :用于存储对象自身运行时数据,比如hashcode,GC分代年龄,锁状态标志,线程持有的锁,线程偏向ID,偏向时间戳等,
      klass : 对象指向它的类元数据指针,虚拟机通过这个指针确定这个对象是哪个类的实例
      数组长度(数组才有)
synchronized 锁升级过程
1 首先一个线程t1请求加锁资源,此时对象头里线程偏向id 存储当前线程的线程id,并且锁的状态标志位加锁。现在是一个偏向锁
2 当再有第二个线程t2过来尝试加锁,发现已经被加锁了,检查加锁的是否是自己,不是t2 则尝试修改对象头偏向id 为自己,修改失败,当t1 运行到安全点时,判断是否t1 已经退出代码块,如果是则t1 释放锁,t2 添加偏向锁,如果t1没有执行完,则升级为轻量级锁
3 轻量级锁,t2 会通过CAS 方式自旋尝试加锁,超过多少次没有获取到锁,则升级成重量级锁,因为自旋获取锁,也是比较费CPU 资源的

锁粗话 StringBubber .append 线程安全,多次append 就会进行一个锁 锁粗话

锁清除 synchronized (new object()) ,因为每次都是锁新对象,jvm 认为没有意思 所以不会加锁 

逃逸分析:如果一个对象只有在一个线程栈中用到,没有其他线程用到,这样这个对象就会在一部分会在栈中不放到堆里。

ReentrantLock 时基于AQS 实现的同步手段,跟synchronized 也是一种互斥锁。保证线程安全。但是它又比synchronized 多了很多特性,比如:公平锁,中断锁,锁超时等等。
ReentrantLock 原理
1 通过cas 方式 设置变量,expect–期望值  update–新值,如果期望值跟内存值相等,修改内存值为新的值。当前线程设置独占访问
 unsafe.compareAndSwapInt(this, stateOffset, expect, update);
setExclusiveOwnerThread(Thread.currentThread()); 

2 如果期望值跟内存之不相等,则获取共享变量判断是否等0 如果等于,则说明没有加锁,通过cas 继续加锁,如果不能与获取设置的线程,跟当前线程比对是否相等,如果相等则说明相同线程加锁,可以继续加锁,重入锁。

3 如果既不能加锁,也不是重入锁。则把当前线程放入队列里

核心思想:就是线程请求一个共享资源,如果共享资源空闲,这对共享资源加锁,如果共享资源已经加锁,则进入阻塞状态以及被唤醒时分配机制。通过CLH队列(虚拟双向队列)实现锁的,既获得不到锁的加入到队列中。

用大白话来说,AQS就是基于CLH队列,用volatile修饰共享变量state,线程通过CAS去改变状态符,成功则获取锁成功,失败则进入等待队列,等待被唤醒。

ReentrantLock lock = new ReentrantLock(false);//false为非公平锁
lock.lock();
lock.tryLock(30, TimeUnit.SECONDS);// 30秒没加上锁,自动释放
lock.lockInterruptibly();// 锁中断

 Condition condition = lock.newCondition();  //lock 等待通知
 condition.await();
 condition.signal();

 可以替换 synchronized  wait notify  

 obj.wait(); obj.notify(); 在synchronized 里否则报错

死锁:a线程锁定一个资源,同时想获取b线程的资源,b线程锁定一个资源,同时想获取a线程的资源。

java 死锁必要条件
1 互斥条件:资源不能被共享,只能由一个线程使用(threadLocal)  
2 请求保持条件:一个线程因请求其他资源而阻塞时,对目前拥有的资源保持不放。(一次性请求所有资源)

3 不可抢占条件:进程已获得的资源,在未使用完之前,不能被剥夺( 超时500毫秒 ,自动释放锁)  lock.tryLock(timeout)。
4 相互等待条件:t1 修改下单状态,减库存,  t2减库存,下单  相互持有对方的锁 等待,死锁(逻辑顺序一致) 

只要打破上面任意一个条件,即不会死锁

什么情况下会释放synchronized

执行完成会释放锁

抛异常会释放锁

wait 释放当前锁

return 释放锁

相关文章:

复习之 java 锁

裁员在家,没有面试机会,整理整理面试知识点吧! 不得不知道的java 锁 Java 中,提供了两种方式来实现同步互斥访问(也就是锁):synchronized 和 Lock 多线程编程中,有可能会出现多个线…...

数据结构与算法 - 图

一、概念 图是有顶点(vertex)和边(edge)组成的数据结构,例如 该图有4个顶点:A、B、C、D以及四条有向边,有向图中,边是单向的。 1. 有向图 VS 无向图 如果是无向图,那么…...

白骑士的HTML教学基础篇 1.1 HTML简介

在现代互联网的世界里,HTML(HyperText Markup Language)是所有网页的基础语言。无论是简约的个人博客还是复杂的商业网站,HTML都扮演着不可或缺的角色。掌握HTML是学习前端开发的第一步,这不仅能够帮助你构建静态网页&…...

c语言基础知识学习

1. C 语言简介 定义:C 语言是一种过程式编程语言,设计用于系统编程和应用程序开发。特点:高效、灵活、接近硬件,支持指针和内存操作。 1. 基本语法 程序结构: C 语言程序由函数组成,main 函数是程序的入口…...

Qt/QML学习-Dial

QML学习 Dial例程视频讲解代码 main.qml import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")Dial {anchors.fill: parentid: dial// 设置旋钮的范围from: 0to: …...

达梦数据库系列—48.DMHS实现Mysql到DM8的同步

目录 DMHS实现Mysql到DM8的同步 1、准备介质 2、安装 3、准备源端Mysql和目标端DM8 软件安装 数据库创建 打开归档 开启附加日志 创建辅助表 Mysql客户端驱动 Mysql端安装ODBC 检查依赖包 创建连接用户 创建测试表 4、同步配置 修改服务配置 Mysql到Dm单向同步…...

PostgreSQL的启动过程

PostgreSQL的启动过程 PostgreSQL的启动过程中主要做了以下几件事: 初始化数据目录:如果数据目录是第一次使用,PostgreSQL会进行初始化,创建必要的系统表和目录结构。 读取配置文件:PostgreSQL会读取并解析配置文件&…...

ActiveMQ、RabbitMQ、Kafka、RocketMQ的区别简介

目录 1. 基本概述 2. 性能与吞吐量 3. 消息模型与特性 4. 生态系统与社区支持 5. 复杂性与运维成本 6.在优先级队列、延迟队列、死信队列、重试队列、消费模式、广播模式方面的区别 7.在消息回溯、消息堆积持久化、消息追踪、消息过滤方面的区别 8.在多租户、多协议支持…...

7.1 多态案例

一、案例1&#xff1a;计算器类 1.1 普通方式实现 #include <iostream> #include <string> using namespace std;class Calculator { public:int num1;int num2;int result(string oper){if (oper "")return num1 num2;else if (oper "-"…...

革新测试管理:集远程、协同、自动化于一身的统一测试管理平台

一、研发背景 当下汽车电子测试领域随着不断发展&#xff0c;自动化、智能化的软硬件一体测试解决方案已经成为趋势。能够整合各种测试资源、自动化测试流程&#xff0c;并提供数据分析和可视化报告&#xff0c;从而提高测试效率、降低成本&#xff0c;并确保汽车电子系统的可…...

HAProxy的详解

一、介绍 1.1 定义 HAProxy是一个使用C语言编写的自由及开放源代码软件&#xff0c;其提供高可用性、负载均衡&#xff0c;以及基于TCP和HTTP的应用程序代理。 HAProxy特别适用于那些负载特大的web站点&#xff0c;这些站点通常又需要会话保持或七层处理。HAProxy运行在当前…...

网络安全实训第一天(dami靶场搭建,XSS、CSRF、模板、任意文件删除添加、框架、密码爆破漏洞)

1.环境准备&#xff1a;搭建漏洞测试的基础环境 安装完phpstudy之后&#xff0c;开启MySQL和Nginx&#xff0c;将dami文件夹复制到网站的根目录下&#xff0c;最后访问安装phptudy机器的IP地址 第一次登录删除dami根目录下install.lck文件 如果检测环境不正确可以下载php5.3.2…...

4.1 SQL的起源与发展

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…...

android中实现禁掉有线网络

1.首先初始化mINetworkManagementServiceProxy // INetworkManagementService mNwService; Object mINetworkManagementServiceProxy;public void init() {// IBinder b ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);// mNwService INetworkManagementSe…...

docker-compose安装MongoDB 7.0.12

文章目录 一. Mac1.1 创建目录1.2 docker-compose.yaml默认不开启relSet开启relSet&#xff08;数据同步&#xff09; 1.3 部署1.4 卸载1.5 replSet配置1.5.1 初始化replSet1.5.2 创建超管用户1.5.3 验证用户1.5.4 查看replSet状态 二. Centos72.1 创建目录2.2 docker-compose.…...

Ubuntu下NFS和SSH服务

本篇文章记录Ubuntu下如何对NFS和SSH服务进行配置和开启。 目录 一、NFS服务 二、SSH服务 1、安装SSH服务 2. 启动和检查SSH服务 3. 配置SSH服务 4. 连接到SSH服务 5. 设置防火墙 6. 测试连接 三、结语 一、NFS服务 NFS&#xff08;Network File System&#xff0…...

游戏管理系统

目录 Java程序设计课程设计 游戏管理系统 1系统简介 1.1需求分析 1.2 编程环境与工具 2系统总体设计 2.1 系统的功能模块图。 2.2 各功能模块简介。 3主要业务流程 &#xff08;1&#xff09;用户及管理员登录流程图 &#xff08;2&#xff09;信息添加流程 &#x…...

坐牢第二十七天(聊天室)

基于UDP的网络聊天室 一.项目需求&#xff1a; 1.如果有用户登录&#xff0c;其他用户可以收到这个人的登录信息 2.如果有人发送信息&#xff0c;其他用户可以收到这个人的群聊信息 3.如果有人下线&#xff0c;其他用户可以收到这个人的下线信息 4.服务器可以发送系统信息…...

C++自学笔记33(数据类型总结与变量)

数据类型 类型位范围char1 个字节-128 到 127 或者 0 到 255unsigned char1 个字节0 到 255signed char1 个字节-128 到 127int4 个字节-2147483648 到 2147483647unsigned int4 个字节0 到 4294967295signed int4 个字节-2147483648 到 2147483647short int2 个字节-32768 到…...

游戏引擎phaser.js3的使用之玩家和静态物理组碰撞

玩家和静态物理组都加载好了&#xff0c;那就应该开始操作玩家动态和静态之间的碰撞了 下面是通过点击图片按钮来操作碰撞的 sky.on(pointerdown, function () { console.log(图片被点击了&#xff01;); }) 图片点击后让动态的玩家和静态的物理组碰撞&#xff0c;就可以这…...

Unity动态植被系统:实时天气与自然现象耦合方案

1. 这不是“贴图堆砌”&#xff0c;而是一套可交互的自然系统你有没有试过在Unity里拖进几棵树、铺点草地&#xff0c;结果运行起来——风一吹&#xff0c;所有树叶像被钉在空中一样纹丝不动&#xff1b;下雨时&#xff0c;雨滴垂直砸进地面&#xff0c;连个水花都没有&#xf…...

TrollInstallerX终极指南:3分钟完成iOS TrollStore安装的强力工具

TrollInstallerX终极指南&#xff1a;3分钟完成iOS TrollStore安装的强力工具 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX TrollInstallerX是一款专为iOS设备设计的T…...

JMeter多线程压测:线程≠用户,避坑指南与真实行为建模

1. 为什么“多线程压测接口”不是简单点几下鼠标就能搞定的事 很多人第一次打开JMeter&#xff0c;新建一个线程组、填个URL、点“启动”&#xff0c;看到“聚合报告”里跳出几百个请求/秒&#xff0c;就以为自己已经掌握了接口压测。我当年也是这么想的——直到在一次电商大促…...

多模态融合在死因推断中的应用:特征级与决策级融合策略对比

1. 项目概述&#xff1a;当AI遇见死因推断&#xff0c;多模态融合如何破局&#xff1f;在公共卫生和流行病学领域&#xff0c;准确推断死因&#xff08;Cause of Death, COD&#xff09;是评估疾病负担、制定卫生政策的基础。然而&#xff0c;在资源有限的地区&#xff0c;获取…...

二进制量化技术如何优化大语言模型部署

1. 二进制量化技术在大语言模型中的革新应用在人工智能领域&#xff0c;大语言模型(LLM)的规模呈指数级增长&#xff0c;随之而来的是巨大的计算资源消耗和内存需求。传统FP16精度模型需要消耗数十GB甚至上百GB的显存&#xff0c;这使得在消费级硬件和边缘设备上部署变得异常困…...

量子机器学习实战:遥感图像分割的混合模型构建与硬件噪声影响分析

1. 项目概述与核心挑战量子机器学习&#xff08;QML&#xff09;这个领域&#xff0c;听起来像是科幻小说里的概念&#xff0c;但过去几年&#xff0c;它已经从理论物理的殿堂&#xff0c;逐渐走进了我们这些做工程和算法应用的人的视野。简单来说&#xff0c;它试图用量子计算…...

HTTPS抓包失败的七层根因与实战定位法

1. 为什么HTTPS抓包总在“看不见”的地方翻车&#xff1f;你刚配好Fiddler或Charles&#xff0c;证书也装了、代理也开了、手机Wi-Fi也指向了电脑IP&#xff0c;可一打开App——抓包窗口空空如也&#xff0c;连个DNS请求都不见&#xff1b;或者只看到一堆CONNECT隧道建立记录&a…...

ML赋能BDI智能体:规划、意图过滤与行动模块的技术融合与实践

1. 项目概述&#xff1a;当经典BDI架构遇上现代机器学习在人工智能领域&#xff0c;构建能够像人一样思考、决策和行动的智能体&#xff08;Agent&#xff09;&#xff0c;一直是研究者们孜孜以求的目标。其中&#xff0c;信念-愿望-意图&#xff08;Belief-Desire-Intention&a…...

手把手教你解锁影驰B360M主板隐藏的fTPM 2.0,绕过限制升级Win11(附BIOS修改避坑指南)

解锁影驰B360M主板fTPM 2.0的完整实战手册当Windows 11的升级提示弹出时&#xff0c;许多使用影驰B360M主板的用户发现自己的设备被系统要求拒之门外——原因很简单&#xff1a;主板BIOS中缺少必要的fTPM 2.0支持选项。这并非硬件不支持&#xff0c;而是厂商在固件层面隐藏了相…...

2026年照片去水印免费软件保姆级教程!学会这几招,告别水印烦恼

你是不是也遇到过这样的抓狂时刻&#xff1f;在平台上刷到一张特别适合做壁纸或配图的高清照片&#xff0c;兴冲冲地保存下来&#xff0c;结果角落里的水印瞬间让整张图的格调打了对折&#xff1b;又或者&#xff0c;自己辛辛苦苦做好的图片&#xff0c;在分享转发几道后&#…...