[JAVAee]锁策略

目录

乐观锁与悲观锁

乐观锁

乐观锁的冲突检测

悲观锁

读锁与写锁

重量级锁与轻量级锁 

重量级锁

轻量级锁

自旋锁

公平锁与非公平锁

可重入锁与不可重入锁


乐观锁与悲观锁

乐观锁

在乐观锁中,假设数据并不会发生冲突,在正式提交数据时会对数据进行冲突检测,如果发生了冲突则会返回错误信息,将决定权交给用户

乐观锁的冲突检测

冲突检测是乐观锁的一个重要功能.

实现这个功能的方式主要是:引入一个版本号,每次线程中的工作内存进行操作后,版本号会相应的+1,只有在提交数据工作内存中的版本号大于主存中的版本号才能提交成功.

示例:

在乐观锁下两个线程分别进行+1操作

首先线程1先被调度,将n进行+1操作后版本号也+1.

线程1中的数据要拷贝到主存中,首先要看两者的版本号.线程1中的版本号大于主存中的版本号,可以写入数据.

 此时,线程2也进行+1操作,但线程2中的工作内存n还没有更新.

当线程2想要写入的时候,会发现自己的版本号没有大于主存中的版本号.

写入失败,主存中的数据就不会更新.

悲观锁

总是假设为最坏的情况,每次去拿数据的时候都会认为别人去修改.所以每次去拿数据的时候都会上锁,这样别人再想拿数据的时候就会阻塞.

对于synchronized来说,初始会使用"乐观锁",发现竞争比较激烈的时候才会自动转换到"悲观锁"

读锁与写锁

在多线程的环境下,数据的读取线程之间是不会互斥的,但读取线程与写入线程之间会互斥.

如果两种情景下,都使用同一把锁.就会产生极大的性能损耗.

为了解决这种情况,就有了读锁与写锁(readers-writer lock)

对于读操作与写操作

  • 线程之间的读操作,并不会有线程安全的问题,可以之间并发读取.
  • 线程之间的写操作,就会产生线程安全的问题.
  • 线程之间的读操作与写操作,会产生线程安全的问题.

 读写锁就可以把这些情况都区分开,降低性能的消耗.

在java标准库中,提供了ReentrantReadWriteLock类,其中实现了读锁写.

ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
        
ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();
readLock.lock();
readLock.unlock();
        
ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();
writeLock.lock();
writeLock.unlock();

其中:(互斥就是线程会进入阻塞状态)

  1. 读锁与读锁之间不互斥
  2. 写锁与写锁之间互斥
  3. 读锁与写锁之间互斥

读写锁适用于频繁读,但不频繁写的场景下.

重量级锁与轻量级锁 

锁的核心特性为:"原子性".

这种特性的来源,能追溯到CPU这种硬件提供的.

  • CPU 提供了 "原子操作指令".
  • 操作系统基于 CPU 的原子指令, 实现了 mutex 互斥锁.
  • JVM 基于操作系统提供的互斥锁, 实现了 synchronized 和 ReentrantLock 等关键字和类.

重量级锁

加锁机制依赖操作系统(内核态)提供mutex.

就会发生大量的内核态与用户态之间的转换即线程的调度

轻量级锁

加锁机制尽量不依赖于操作系统的mutex,而是在用户态中使用代码实现.如果无法实现,再去调用mutex.

可以减少内核态与用户态之间的转换

 synchronized初始为轻量级锁,在竞争激烈的时候才转换为重量级锁

自旋锁

线程在抢锁失败后会进入阻塞状态(放弃CPU,暂时停止运行).需要经过较久的时间才会被重新调度.

通常情况下,抢夺的锁很快就会被释放出来.就没必要进入阻塞(放弃CPU).

自旋锁就可以解决这种情况.

自旋锁在竞争锁失败后,会立即尝试获取锁,循环直到成功获取到锁.一旦锁被释放,很快就能够获取到.

自旋锁虽然能在锁被释放的第一时间获取到锁,但如果锁被占用的时间较长就会持续的消耗CPU的资源.

公平锁与非公平锁

  • 公平锁:遵守先来后到的顺序,先尝试获取锁的线程首先能占用到
  • 非公平锁:不遵守先来后到的顺序,随机调度

在操作系统中,锁的调度都是随机的.如果不加以任何限制,那么其就是一个非公平锁.

而实现公平锁,需要一个额外的数据结构来存储线程尝试获取锁的顺序.

synchronized是一个非公平锁

可重入锁与不可重入锁

可重入锁的字面意思是“可以重新进入的锁”,即允许同一个线程多次获取同一把锁.加锁后仍然可以进行递归操作重新获取锁而不会阻塞自己的锁就为可重入锁.(因为这个原因可重入锁也叫做递归锁)

synchronized是可重入锁
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ARM 常见汇编指令学习 9 - 缓存管理指令 DC 与 IC

文章目录 ARM64 DC 与 IC 指令 上篇文章:ARM 常见汇编指令学习 8 - dsb sy 指令及 dsb 参数介绍 ARM64 DC 与 IC 指令 AArch64指令集中有两条关于缓存维护(cache maintenance)的指令,分别是IC和DC。 IC 是用于指令缓存操作&…

项目经理必读:领导风格对项目成功的关键影响

引言 项目经理作为一个领导者的角色,他们需要协调各方资源,管理团队,推动项目的进行。为了完成这些任务,项目经理必须具备各种领导风格的灵活性,以应对项目中的各种变数和挑战。在这篇文章中,我们将讨论领…

SpringBoot 项目创建与运行

一、Spring Boot 1、什么是Spring Boot?为什么要学 Spring Boot Spring 的诞生是为了简化 Java 程序的开发的,而 Spring Boot 的诞生是为了简化 Spring 程序开发的。 Spring Boot 翻译一下就是 Spring 脚手架 盖房子的这个架子就是脚手架,…

LeetCode 25题:K个一组翻转链表

题目: 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯…

web爬虫第五弹 - JS逆向入门(猿人学第一题)

0- 前言 爬虫是一门需要实战的学问。 而对于初学者来说,要想学好反爬,js逆向则是敲门砖。今天给大家带来一个js逆向入门实例,接下来我们一步一步来感受下入门的逆向是什么样的。该案例选自猿人学练习题。猿人学第一题 1- 拿到需求 进入页面…

在登录界面中设置登录框、多选项和按钮(HTML和CSS)

登录框(Input框)的样式: /* 设置输入框的宽度和高度 */ input[type"text"], input[type"password"] {width: 200px;height: 30px; }/* 设置输入框的边框样式、颜色和圆角 */ input[type"text"], input[type&q…

flutter:占位视图(骨架屏、shimmer)

前言 有时候打开美团,在刚加载数据时会显示一个占位视图,如下: 那么这个是如何实现的呢?我们可以使用shimmer来开发该功能 实现 官方文档 https://pub-web.flutter-io.cn/packages/shimmer 安装 flutter pub add shimmer示例…

Pytest+Allure+Excel接口自动化测试框架实战

1. Allure 简介 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具,它不仅以 Web 的方式展示了简介的测试结果,而且允许参与开发过程的每个人可以从日常执行的测试中,最大限度地提取有用信息。 Allure 是由 Java 语言开发…

【laravel+vue2 】医院信息化手术麻醉临床信息管理系统源码

近年来,医院信息化成为医院领域的推广重点,HIS、LIS、PACS、EMR等信息系统的相继出现,显著提高了医院业务的运行效率。手术麻醉系统作为医院信息系统的一部分,由监护设备数据采集系统和麻醉信息管理系统两个子系统组成。 一、医院…

复亚智能打造全新云平台:让无人机任务管理更智能、更简单

复亚智能全新升级的MindView云平台,对航线规划、任务管理、自动飞行、数据管理等各个环节开展可视化、数字化、智能化监管,从任务到结果的“看得清”、“管得住”、“查得准”,带来更轻松的操作,改善作业效率、安全保障和用户体验…

抖音seo矩阵系统源码搭建开发详解

抖音SEO矩阵系统是一个用于提高抖音视频在搜索引擎排名的工具。如果你想开发自己的抖音SEO矩阵系统,以下是详细的步骤: 开发步骤详解: 确定你需要的功能和算法 抖音SEO矩阵系统包含很多功能,比如关键词研究、内容优化、链接建设、…

SQL基础复习与进阶

SQL进阶 文章目录 SQL进阶关键字复习ALLANYEXISTS 内置函数ROUND(四舍五入)TRUNCATE(截断函数)SEILING(向上取整)FLOOR(向下取整)ABS(获取绝对值)RAND&#x…

HTML 初

前言 HTML的基本骨架 HTML基本骨架是构建网页的最基本的结果。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

8月4日上课内容 nginx(重要内容,面试必问)

国外主要还是apache nginx高性能、轻量级的web服务软件。 nginx的特点 1、稳定性高。&#xff08;没有apache稳定&#xff09; 常用版本 1.12 1.20 1.22 2、系统资源消耗低。&#xff08;处理http请求的并发能力很高&#xff0c;单台服务器可以处理30000-50000个并发请求。…

【无标题】一篇文章带你彻底理解Java ArrayList数据结构详解

一篇文章带你彻底理解Java ArrayList数据结构详解 基本概念&#xff1a; ​ **之前创建数组的时候&#xff0c;需要声明提前声明数组的大小&#xff0c;**ArrayList是一个可以动态修改的数组&#xff0c;与普通数组的区别就是没有固定大小的限制&#xff0c;它会动态调整长度…

2023华数杯数学建模竞赛C题思路解析

如下为&#xff1a;2023华数杯数学建模竞赛C题 母亲身心健康对婴儿成长的影响 的思路解析 C题 母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一&#xff0c;她不仅为婴儿提供营养物质和身体保护&#xff0c;还为婴儿提供情感支持和安全感。母亲心理健康状态的不…

Web-1-网站工作流程介绍

我们学习web开发&#xff0c;首先要知道什么是Web&#xff1f; Web: 全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站 比如我展示的这京东&#xff0c;淘宝唯品会都叫做网站&#xff0c;那么现在大家想一下&#xff0c;你还知道什…

2023-08-03 LeetCode每日一题(删除注释)

2023-08-03每日一题 一、题目编号 722. 删除注释二、题目链接 点击跳转到题目位置 三、题目描述 给一个 C 程序&#xff0c;删除程序中的注释。这个程序source是一个数组&#xff0c;其中source[i]表示第 i 行源码。 这表示每行源码由 ‘\n’ 分隔。 在 C 中有两种注释风…

Qt 中操作xml文件和JSON字符串

文章目录 1、概述1.1、xml介绍1.2、json介绍 2、xml文件增删改查2.1、写xml文件内容2.2、读xml文件内容2.3、删除xml文件内容2.4、修改xml文件内容 3、构建JSON字符串3.1、JSON字符串排版4、剪切板操作 1、概述 1.1、xml介绍 XML 指可扩展标记语言&#xff08;EXtensible Mark…

复现原型链污染漏洞

目录 一、复现原型链污染漏洞 hackit 2018 1、创建hackit_2018.js文件 2、运行hackit_2018.js文件 3、寻找原型链漏洞 4、污染原型链 hackit 2018 1、创建hackit_2018.js文件 const express require(express) var hbs require(hbs); var bodyParser require(body-par…