JUC之锁
公平锁、非公平锁
公平锁指的是多线程按照申请锁的顺序来获取锁;
非公平锁指的是多线程不按照申请锁的顺序来获取锁。可能会出现优先级反转(后者居上)
公平锁为了保证线程申请顺序,势必要付出一定的性能代价,因此其吞吐量一般低于非公平锁
synchronized 支持非公平锁;Lock默认非公平锁,但支持公平锁
可重入锁(递归锁)
可重入锁又名递归锁,是指 同一个线程在外层方法获取了锁,在进入内层方法会自动获取锁。
synchronized void setA() throws Exception{Thread.sleep(1000);setB();
}synchronized void setB() throws Exception{Thread.sleep(1000);
}
如果使用的锁不是可重入锁的话,setB()可能不会被当前线程执行,从而造成死锁。可重入锁可以在一定程度上避免死锁。
自旋锁
自旋锁是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁
自旋等待的时间必须要有一定的限度,如果自旋超过了限定次数,就应当挂起线程。自旋锁的实现原理是CAS
乐观锁、悲观锁
乐观锁与悲观锁不是指具体的什么类型的锁,而是处理并发同步的策略。
悲观锁 - 悲观锁对于并发采取悲观的态度,认为:不加锁的并发操作一定会出问题。悲观锁适合写操作频繁的场景;
乐观锁 - 乐观锁对于并发采取乐观的态度,认为:不加锁的并发操作也没什么问题。对于同一个数据的并发操作,是不会发生修改的。在更新数据的时候,会采用不断尝试更新的方式更新数据。乐观锁适合读多写少的场景;
独享锁与共享锁
独享锁与共享锁是一种广义上的说法,从实际用途上来看,也常被称为互斥锁与读写锁
独享锁 - 独享锁是指 锁一次只能被一个线程所持有
共享锁 - 共享锁是指 锁可被多个线程所持有
无锁 、 偏向锁、轻量级锁、重量级锁
一个对象其实有四种锁状态,它们级别由低到高;
无锁:没有对资源进行锁定,任何线程都可以尝试去修改它,但同时只有一个线程能修改成功;
偏向锁:是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁,降低获取锁的代价;
轻量级锁:当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能;
重量级锁:若当前只有一个等待线程,则该线程通过自旋进行等待。但是当自旋超过一定的次数,或者一个线程在持有锁,一个线程在自旋,又有第三个线程来访时,轻量级锁升级为重量级锁;升级为重量级锁时,等待锁的线程都会进入阻塞状态;
死锁
两个或多个线程因竞争资源出现等待彼此造成永久阻塞的情况;
产生条件:
1.一段时间内某资源仅为一线程所占用
2.线程对已获得的资源保持不放
3.进程已获得的资源在未使用完之前,不能剥夺
4.线程之间出现循环等待资源
public class DeadLock {static Object object1 = new Object();static Object object2 = new Object();public static void main(String[] args) {new Thread(() -> {synchronized (object1){System.out.println("a线程已经获得锁1 --> 等待获得锁2");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}synchronized (object2){System.out.println("a线程成功获得锁2");}}},"a").start();new Thread(() -> {synchronized (object2){System.out.println("b线程已经获得锁2 --> 等待获得锁1");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}synchronized (object1){System.out.println("b线程成功获得锁1");}}},"b").start();}
}
解决办法:
1.让程序每次至多只能获得一个锁
2.设计时考虑清楚锁的顺序,尽量减少嵌在的加锁交互数量
3.死锁检测
4.设置加锁时限
相关文章:
JUC之锁
公平锁、非公平锁 公平锁指的是多线程按照申请锁的顺序来获取锁; 非公平锁指的是多线程不按照申请锁的顺序来获取锁。可能会出现优先级反转(后者居上) 公平锁为了保证线程申请顺序,势必要付出一定的性能代价,因此其吞…...
C++中的 cout 和 printf 用法
文章目录 前言cout & printfexampleprintf输出string字符串总结 前言 C是一种面向对象的编程语言,它继承了C语言的特点,同时也增加了许多新的特性。在C中的cout 和 printf是两种常用的输出函数,它们都可以将数据显示在屏幕上,…...
Maven基础使用
Maven 学习目标 理解Maven的用途掌握Maven的基本操作掌握Maven如何创建Web项目 Maven是什么 面临问题 在学习Maven之前,我们先来看一下我们现在做的项目都有哪些问题。假设你现在做了一个crm的系统,项目中肯定要用到一些jar包,比如说myb…...
【C++ 入坑指南】(06)运算符
文章目录 一、算术运算符二、赋值运算符三、比较运算符四、逻辑运算符五、算法题5.1、拆分位数 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 内置了丰富的运算符,并提供了以下类型的运算符: 运算符类型作用算术运算符用于处理四则运算赋值…...
了解一下js中的函数式编程
js中的函数式编程是一种编程范式,它将函数作为一等公民来使用。 在函数式编程中,函数是一种特殊的对象,可以赋值给变量、作为参数传递给其他函数、或作为其他函数的返回值。 函数式编程强调了函数的纯函数性,即函数输入相同时&a…...
动态HTTP代理在linux里的使用
动态HTTP代理是一种可以自动切换代理IP地址的代理方式,可以有效地绕过一些限制访问的网站。在Linux系统中,可以使用Privoxy和Proxychains来实现动态HTTP代理。 以下是在Linux中使用动态HTTP代理的步骤: 1. 安装Privoxy和Proxychains 在终端中…...
软考证书值得考吗?怎么考?
软考证书是什么?有什么用处?必须先明确这两个问题,才能有复习和考取的动力。怎么考过?这是第二步要着重解决的问题。今天详细帮助大家分析一下。 软考是国家级考试,具有强大的权威性与公信力。 软考全称为计算机技术…...
超级秘密文件夹忘记密码的解决办法
超级秘密文件夹是一款非常特殊的文件夹加密软件,它来无影去无踪,在安装后不会留下任何痕迹,只能通过软件热键才能打开。那么如果在使用过程中忘记了密码,这时我们该怎么办呢?下面我们就来了解一下。 首先,我…...
脑的物理系统
⼤脑模块化 人脑是一个复杂的网络,一般将大脑划分为不同的区域(即节点),并使用某种方法表征大脑区域之间的关系(即连接的边)来构建人脑网络。在功能磁共振成像(fMRI)数据的网络模型…...
1054. 距离相等的条形码(leetcode,堆问题,priority_queue)-------------------c++实现
1054. 距离相等的条形码(leetcode,堆问题,priority_queue)-------------------c实现 题目表述 在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。 请你重新排列这些条形码,使其中任意两个相…...
QT开发实战-动态壁纸软件
动态壁纸软件开发 项目源代码在下面链接获取: ----------------------------- 开发者:CodeSharkSJ 希望此项目能加强你对Qt的应用 文章目录 项目图与开发环境核心技术原理自定义窗口程序UI布局背景绘制样式表基本实现QWebEngineQMedia使用系统托盘隐藏记忆功能应用程序打包 …...
Netty核心组件模块(一)
1.Bootstrap和ServerBootstrap 1>.Bootstrap意思是引导,一个Netty应用通常由一个Bootstrap开始,主要作用是配置整个Netty程序,串联各个组件,Netty中Bootstrap类是客户端程序的启动引导类,ServerBootstrap是服务端启动引导类; 2>.常见的方法有: ①.public ServerBootstr…...
Robot Framework+Jenkins持续集成UI自动化项目
使用Robot Framework框架可进行Web端和APP端的UI自动化测试,为方便定时执行,可将Robot Framework的自动化项目持续集成至Jenkins平台,具体的操作步骤如下: 安装Jenkins的步骤如下: 手把手教小白安装Jenkins_程序员馨馨…...
【ROS】ROS1编程速览
1、简述 很多项目已经转向ROS2,本人作为ROS小白从ROS1开始学起,但是不会深入学习ROS1,只一带而过。 下面只了解一些ROS1中的概念和基本编程接口。 ROS1中有两种通信模式:话题模式和服务模式,区别如下 2、话题模式 …...
探索智能化:TOOM解析未来稿件校验系统的技术进展与应用展望
在信息时代,随着大数据、人工智能和自然语言处理等技术的快速发展,稿件校验系统正朝着智能化的方向迈进。智能化的稿件校验系统能够更准确、高效地检测虚假信息、抄袭行为以及提升文章质量。本文将探讨智能化稿件校验系统的技术进展与应用展望࿰…...
Java程序员从青铜到王者,不同段位的薪资和技能变化
想要薪资高,段位就得跟上,对于Java程序员来说,从青铜到王者,需要经历多个阶段,每个阶段需要掌握的技能都不一样。 今天,我们一起来看看每个段位都有什么特点、需要具备哪些“大杀”技能,也看看…...
tinyWebServer 学习笔记——二、HTTP 连接处理
文章目录 一、基础知识1. epoll2. 再谈 I/O 复用3. 触发模式和 EPOLLONESHOT4. HTTP 报文5. HTTP 状态码6. 有限状态机7. 主从状态机8. HTTP_CODE9. HTTP 处理流程 二、代码解析1. HTTP 类2. 读取客户数据2. epoll 事件相关3. 接收 HTTP 请求4. HTTP 报文解析5. HTTP 请求响应 …...
深入浅析Linux Perf 性能分析工具及火焰图
Perf Event 子系统 Perf 是内置于 Linux 内核源码树中的性能剖析(profiling)工具。它基于事件采样的原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。可用于性能瓶颈的查找与热点代码的定位…...
java关键术语
java具有11个关键的术语,这些术语是从java的设计者所编写的白皮书中摘取,这些术语分别为:简单性、面向对象、分布式、健壮性、安全性、体系结构中立、可移植性、解释型、高性能、多线程、多态性。以下开始我们将逐一解说这些术语。 一、简单性 Java是C++语法的纯净版本,剔…...
1. 两数之和【简单】
题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
