iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >带你了解JAVA中的一些锁概念
  • 869
分享到

带你了解JAVA中的一些锁概念

2024-04-02 19:04:59 869人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录乐观锁和悲观锁读写锁重量解锁和轻量级锁自旋锁公平锁和非公平锁可重入锁和不可重入锁死锁CAS(compare and swap)比较并交换synchronized的锁升级过程总结乐

乐观锁和悲观锁

乐观锁:这个锁认为出现锁竞争的概率比较低(当前线程中,线程数量较少,不太涉及竞争,就偶尔竞争一下)

悲观锁:这个所认为出现锁竞争的概率比较大(当前场景中,线程数目比较多,可能涉及竞争)

读写锁

普通的锁提供两个操作:加锁,解锁

读写锁提供三个操作:读加锁,写加锁,解锁。

读加锁和读加锁:不需要互斥

写加锁和写加锁之间:需要互斥

读加锁和写加锁之间:需要互斥

主要适用于读多写少的场景

重量解锁和轻量级锁

从工作量来区分:

重量级锁,工作量更多,消耗资源更多,锁更慢

轻量级锁,工作量更少,消耗资源少,锁更快

操作系统中的mutex就是一个重量级锁(也是悲观锁),这个锁在加锁的时候就会遇到冲突,就会产生内核态和用户态的切换,以及线程的调度和阻塞。

自旋锁

在加锁的时候遇到冲突,不会涉及到用户态和内核态的切换,直接尝试重新获取锁。

会一直在循环中尝试获取锁,直到获取成功,这个过程中没有放弃cpu,不涉及线程调度。

公平锁和非公平锁

在这里插入图片描述

什么叫公平?

就是先来先服务。

如果不是按照先来后到的方式获取锁,就是非公平锁。

可重入锁和不可重入锁

一个线程对于相同的一把锁连续加锁两次。

对于不可重入锁:就会有问题

对于可重入锁:可以充入

例如:我们常用的synchronized就是可重入锁

因为synchronized的底层有一个计数器,当你对同一个对象连续加锁几次后,它的计数器就会加几次,解锁的时候,计数器就会–。

死锁

当产生死锁之后,就无法继续往下工作了(严重BUG)

死锁产生的原因:产生环路等待。

死锁的危害:线程无法继续工作。

避免死锁:1.不要在加锁的代码中在尝试获取其他锁;2.约定一定的顺序获取其他锁。

在这里插入图片描述

CAS(compare and swap)比较并交换

在这里插入图片描述

java中AtomicInteger中的自增方法就可以看出来,如果Var1对象中的值和var2是相等的,就可以将var1的值更新。如果不是,就会一直自旋。

随着CAS的出现就会有ABA问题

什么是ABA问题呢?

举个栗子:ABA问题就是你买了个新手机你不知道这个手机是新机还是翻新机。

画个抽象一点图在解释一下:

在这里插入图片描述

那怎么解决ABA问题呢?

答案是加个版本号!!!

在这里插入图片描述

synchronized的锁升级过程

具体逻辑是这样的:

无锁状态-偏向锁-轻量级锁-重量级锁

第一个线程加锁的时候,并不是真正意义上的加锁,而是设置了一个标记位。

当第二个线程也来访问同一个变量的时候,第一个线程才是真正意义上的加锁,第二个线程也会加锁。这就从偏向锁转向了轻量级锁,随着相乘越来越多,因为轻量级锁内部是自旋锁,多个线程的情况下也不容易立马获取到锁,这时吃cup就越来越严重,慢慢的就转变成了重量级锁,此时没获取到锁的线程转变为内核态,进行阻塞。

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: 带你了解JAVA中的一些锁概念

本文链接: https://www.lsjlt.com/news/132893.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 带你了解JAVA中的一些锁概念
    目录乐观锁和悲观锁读写锁重量解锁和轻量级锁自旋锁公平锁和非公平锁可重入锁和不可重入锁死锁CAS(compare and swap)比较并交换synchronized的锁升级过程总结乐...
    99+
    2024-04-02
  • 一文带你了解MySQL中的锁机制
    目录一.概述 分类二.MyISAM表锁如何加表锁写锁演示三.InnoDB行锁行锁特点一.概述 锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢)。 在数据库中,除传统的计算资源(如CPU、RAM、I...
    99+
    2023-02-17
    MySQL锁机制使用 MySQL锁机制 MySQL锁
  • 一篇文章带你入门Java基本概念
    目录Java基本概念一、JRE(Java运行时环境)二、JDK(Java开发工具)三、Java源代码文件(.class)四、Java字节码文件(.java)五、Java虚拟机(JVM...
    99+
    2024-04-02
  • 一文带你了解MySQL之锁
    目录 一、解决并发事务带来问题的两种基本方式1.1 一致性读(Consistent Reads)1.2 锁定读(Locking Reads)1.2.1 共享锁和独占锁1.2.2 锁定读的语句 1.3 写操作 二、多粒度锁三...
    99+
    2023-08-16
    mysql 数据库 大数据 数据库架构 数据库开发
  • 一文带你了解Java中的ForkJoin
    目录什么是ForkJoinForkJoinTask 任务ForkJoinPool 线程池工作窃取算法构造方法提交方法创建工人(线程)例:ForkJoinTask实现归并排序ForkJ...
    99+
    2024-04-02
  • java中锁的概念是什么
    java中锁的概念是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。python有哪些常用库python常用的库:1.requesuts;2.scrapy;3.pillow;...
    99+
    2023-06-14
  • 一文带你了解Java
    今天就跟大家聊聊有关一文带你了解Java,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java 简介Java是由Sun Microsystems公司(现已被oracle公司收购)于1...
    99+
    2023-05-31
    java ava
  • java中乐观锁与悲观锁的概念
    这篇文章主要介绍“java中乐观锁与悲观锁的概念”,在日常操作中,相信很多人在java中乐观锁与悲观锁的概念问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java中乐观锁与悲观锁的概念”的疑惑有所帮助!接下来...
    99+
    2023-06-19
  • 一篇文章带你了解Maven的坐标概念以及依赖管理
    目录1、什么是坐标?①、数学中的坐标②、Maven 中的坐标③、Maven 坐标和仓库,jar 包的关系2、什么是依赖?3、依赖的详细配置4、依赖的范围 scope1、compile...
    99+
    2024-04-02
  • 一文带你了解Go语言中锁的实现
    目录前言MutexLocklockSlowUnlockUnlockSlow其他关键函数RWMutexLock()UnLock()RLock()UnRLock()前言 此文为学习go锁...
    99+
    2023-03-15
    Go语言 锁 Go语言 读写锁 Go 锁
  • 一文带你了解Java中的SPI机制
    目录1: SPI机制简介2: SPI原理3: 使用场景4: 源码论证5: 实战6: 优缺点6.1 优点6.2 缺点1: SPI机制简介 SPI 全称是 ...
    99+
    2023-05-15
    Java SPI机制原理 Java SPI机制使用 Java SPI机制
  • 一篇文章带你了解清楚Mysql 锁
    一丶为什么数据库需要锁 数据库锁设计的初衷是处理并发问题。作为多用户共享 的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实 现这些访问规则的重要数据结构。 根据加锁的范围,mysql 里面...
    99+
    2022-11-29
    mysql锁机制 mysql锁机制应用场景 mysql锁表和解锁语句
  • 一文带你深入了解Java TreeMap
    目录概述TreeMap介绍构造方法关键方法使用案例核心机制实现原理源码解析成员变量查找get方法插入put方法删除remove方法概述 TreeMap是Map家族中的一员,也是用来存...
    99+
    2024-04-02
  • 一文带你了解Java中的函数式编程
    目录概述背景函数式的价值新旧对比Lambda 表达式方法引用Runnable 接口未绑定的方法引用构造函数引用函数式接口基本类型非基本类型多参数函数式接口高阶函数闭包函数组合柯里化总...
    99+
    2023-05-14
    Java函数式编程 Java函数编程
  • 一文带你全面了解Java Hashtable
    目录概述介绍和使用核心机制实现机制扩容机制源码解析成员变量构造函数put方法get方法remove方法总结概述 HashTable是jdk 1.0中引入的产物,基本上现在很少使用了,...
    99+
    2024-04-02
  • 带你一文了解C#中的Expression
    目录前言Expression与Expression Tree参考源码总结前言 我们书接上文,我们在了解LINQ下面有说到在本地查询IEnumerbale主要是用委托来作为传参,而解析...
    99+
    2024-04-02
  • 一文带你了解Golang中的WaitGroups
    目录什么是WaitGroups如何使用WaitGroups为什么使用WaitGroups而不是channel需要注意的一件事总结什么是WaitGroups WaitGroups是同步...
    99+
    2023-03-14
    Golang WaitGroups使用 Golang WaitGroups Golang WaitGroup
  • 带你一文了解C#中的LINQ
    目录前言LINQ的根基IEnumerable和IEnumeratorLINQ的基本用法扩展方法在LINQ的应用:LINQ的流式语法LINQ的查询表达式:LINQ的查询语法LINQ的延...
    99+
    2024-04-02
  • 一篇文章带你了解一些Java反射的学习记录
    目录一、反射概述二、入门案例三、反射原理图四、反射性能测试五、Class类六、类加载总结一、反射概述 反射允许程序在运行中获取类的内部信息,例如构造器、成员变量、成员方法等...
    99+
    2024-04-02
  • 深入了解PHP中的Request概念
    标题:深入了解PHP中的Request概念 在PHP编程中,Request是一个非常重要的概念,它代表着客户端向服务器发送的请求。了解Request的机制可以帮助我们更好地处理用户输入...
    99+
    2024-02-27
    php request 概念 表单提交
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作