java多线程的15种锁

article/2025/10/20 19:18:58

1 java锁分类

下面我们依照序号依次的介绍每一种锁

2 悲观锁和乐观锁

悲观锁和乐观锁是一种广义的概念,体现的是看待线程同步的不同的角度

悲观锁认为自己在使用数据的时候,一定有别的线程来修改数据,在获取数据的时候会先加锁,确保数据不会被别的线程修改。

锁实现:关键字synchronized、接口Lock的实现类

使用的场景:写操作较多,先加锁可以保证写操作是数据正确

乐观锁认为自己在使用数据的时候不会有其他的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据
锁实现:CAS算法
使用场景:读操作较多,不加锁的特点能够使其读操作的性能大幅提升

3 阻塞和自旋锁

是指当一个线程在获取锁的饿时候,如果锁已经被其他线程获取,那么该线程将循环等待,然后不断判断是否能够被成功获取,自旋知道获取到锁才会退出循环。自旋是通过CAS算法进行的。何为CAS算法呢?

CAS(compare and swap):比较和交换,顾名思义就是先进行比较然后在进行交换。这里比较和交换是线程中的数据和内存中的数据之间的操作。

如下图所示:1 线程1和线程2都读取内存中的数据V赋值给A 2 线程1把V的值由0改为了1,并想把修改后的值写回到内存 3 线程1将A的值和V的值进行比较 4 两者相等,说明没有线程对V的值进行修改,直接把修改后的值(B=1)写入内存,此时,V=1。3 线程2进行将A的值和V的值进行比较 5 两者不相等,说明有线程对V的值进行修改,此时线程2不能够把修改后的值写入内存,因为它获得的A的值不是最新的,由A得到的B的值也可能是错误的。线程2会读取A的值,重新计算出B的值,再尝试重新写入,如果还是不相等在继续尝试,不断的自旋。

我们发现CAS算法存在一个非常明显的缺陷,那就是ABA问题。何为ABA问题呢?

如下图所示:线程1线程2 线程3 都获取A=V=0  1 线程1修改V的值为1 写入内存 2 线程2 把v的值改为2,但是没来的及写入,线程3 就开始运行 3 线程3 将V的值改为0 写入内存 4 线程2 比较A和V的值发现A=V,他自认为没有其他的线程对V进行修改,因而忽略了A->B->A的过程,形成了ABA问题。ABA的问题解决方法很简单:AtomicStampedReference在变量前面添加版本号,每次变量更新的时候都把版本号加一。

 

我们知道自旋是会消耗CPU资源的(不断循环),为什么不用阻塞的方式使等待的线程停止工作呢?原因有两个

(1)同步代码块逻辑简单情况下,自旋消耗的资源时很少的(在同步代码块逻辑简单的情况下,用自旋是比较合适的)

(2)最为关键的原因是阻塞与唤醒线程需要操作系统切换CPU状态,需要消耗一定的时间(CPU上下文切换)

那么为什么阻塞和唤醒线程会消耗大量时间呢?

因为线程的阻塞唤醒涉及大量的步骤,我们以线程阻塞为例进行说明

步骤1:线程1获取CPU时间片执行

步骤2:线程1被阻塞,上下文切换

步骤3:线程2抢占CPU时间片执行

步骤2涉及两个子步骤:

步骤2.1 从用户态切换到内核态

为什么要进行这种切换呢?

用户是没有权限对内存进行操作,我们要切换到内核态才有权对内存进行操作。

步骤2.2 把线程1的状态保存到PCB(内存)

我们到底要保存线程的哪些信息呢?

一个线程在运行时的内存模型主要有5个部分组成:(1)程序计数器:记录下一条指令的地址(2)虚拟机栈:保存函数的信息,例如,局部的变量,函数返回地址,操作数等(3)本地方法栈:和虚拟机栈类似,不过其保存的函数的信息是native函数(4)方法区:保存类的信息,静态变量等(5)堆:实例化的对象(堆是用户申请的(C语言中malloc函数),而栈是系统自动分配的)。很明显:程序计数器、虚拟机栈、方法区、堆等信息都会被保存到内存中。

可见上下文切换是非常耗时的。

4 无锁、偏向锁、轻量级锁、重量级锁

随着竞争不断的加剧,锁要不断的升级。

(1)无锁:适用于单线程(2)偏向锁:适用于只有一个线程访问同步块的情况,因为多个线程同时访问同步块,给某一个线程特权是不合理的(3)轻量级锁:竞争不是太多,循环等待消耗CPU资源的线程的数量在可接受的范围(4)重量级锁:多个线程同时竞争资源,只让一个线程运行,其余的线程都阻塞

5 可重入锁和不可重入锁

可重入锁:一个线程可以多次获得同一把锁并通过state记录加了多少锁

6 公平锁和非公平锁

公平锁和非公平锁主要是关于等待的线程的排队的问题,这个排队要利用AQS(AbstractQueuedSynchronizer)

我们以重入锁(ReentrantLock)为例解释AQS。AQS由三个部分组成,State:当前线程锁的个数、exclusiveOwerThread:当前占有锁的线程 、CLH队列等待运行的线程。

1 线程1 CAS算法A=V(state)=0,修改state的值为1 2 线程1又想获取锁,此时A=V(state)=1,state再加1,无论A想获得多少次,只是state+1 3 线程2 进行CAS比较,发现A不等于V,并且发现state不等于0,直接到CLH列队中等待。线程3和线程4也一样到CLH队列中等待。如果先来的线程先排队,获取锁的优先权,则为公平锁。如果,无视等待队列,直接尝试获取锁,则为非公平锁。

队列如果已经满了,该怎么办呢?

无法进入队列的线程,进入ArrayBlockingQueue,等队列有空位再进入队列

7 互斥锁和共享锁

互斥锁:在访问共享资源之前对进行加锁操作,在访问完成之后进行解锁操作。 加锁后,任何其他试图再次加锁的线程会被阻塞,直到当前进程解锁。

共享锁:共享锁从字面来看也即是允许多个线程共同访问资源。

互斥锁很容易理解,上锁之后,其他线程都阻塞了。

共享锁一个典型的例子就是读者写者模式,一个人写多个人去读,写者写出的东西,多个读者是可以一块去读的,这就是多个读者共享一个同步资源。

共享锁--用到共享锁的有Semapore信号量和ReadLock读锁


http://chatgpt.dhexx.cn/article/qkbIus34.shtml

相关文章

Java多线程 - 锁

Java多线程 - 锁 三性 可见性 指的是线程之间的可见性,一个线程对状态的修改,对其他线程是可见的。在 Java中 volatile、synchronized 和 final 实现可见性。 原子性 如果一个操作是不可分割的,我们则称之为原子操作,也就是有原…

Java多线程与锁

前文中,我们已经了解了什么是线程,线程间常用通信方式,线程池以及其相关特性,可以看出锁在多线程环境中充当着重要作用,不管是线程间的数据通信,还是线程间的等待和唤醒,都依赖于锁,…

JAVA基础-多线程中锁机制

多线程锁 多线程锁机制锁的定义锁的分类公平锁/非公平锁可重入锁独享锁/共享锁互斥锁/读写锁乐观锁/悲观锁分段锁偏向锁/轻量级锁/重量级锁自旋锁 锁的使用AQSAQS框架展示AQS定义两种资源共享方式AQS常用的几种方法(自定义同步器实现时)自定义同步器实现…

多线程系列-Java中的锁(简介)

前言 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8和Netty 3.10.6)、使用场景进行举例,为读者介绍主流锁的知识点,以…

JAVA如何在线程中加锁(四种方法)

JAVA多线程锁 线程的生命周期 ​ 总共六种状态,可归结为五种,线程的最终是死亡,阻塞不是最终状态,只是一个临时状态。只有调用了start方法,线程才进入就绪阶段。 //新生 ​ NEW, //运行​ RUNNABLE, //阻塞​ BLOCKE…

大数据平台_大数据应用场景有哪些

大数据时代的出现,简单的讲是海量数据同完美计算能力结合的结果,确切的说是移动互联网、物联网产生了海量的数据,大数据计算技术完美地解决了海量数据的收集、存储、计算、分析的问题。一些公司也成立了大数据部门,大数据得到了企…

银行业9大数据科学应用案例

在银行业中使用数据科学不仅仅是一种趋势,它已成为保持竞争的必要条件。 银行必须认识到, 大数据技术可以帮助他们有效地集中资源,做出更明智的决策并提高绩效。 以下我们罗列银行业使用的数据科学用例清单, 让您了解如何处理大量数据以及如何有效使用数据。 [TOC] 1 欺诈识…

某银行大数据体系架构设计与演进

近年来,随着大数据与人工智能相关技术的迅速发展,新技术逐步在全社会各行各业得到应用。银行业作为一个高度信息化的行业,首当其冲面临着互联网新技术应用的挑战。民生银行在 2013 年开始布局分布式、大数据及人工智能技术等领域,…

图解大数据 | 大数据生态与应用导论

作者:韩信子[ShowMeAI](https://www.showmeai.tech 教程地址:https://www.showmeai.tech/tutorials/84 本文地址:https://www.showmeai.tech/article-detail/167 声明:版权所有,转载请联系平台与作者并注明出处 收藏S…

大数据应用于生活,目前主要应用在哪些领域?

如果提到“大数据”时,你会想到什么?也许大部分人会联想到庞大的服务器集群;或者联想到销售商提供的一些个性化的推荐和建议。 如今大数据的深度和广度远不止这些,大数据已经在人类社会实践中发挥着巨大的优势,其利用价值也超出我们的想像。…

大数据应用管理模式及内容

通过调研,数据应用管理可总结为分散管理型、职能复用型、集中管理型三种模式,数据应用管理模式中重点关注组织管理、需求管理、建设管理、成果管理四大领域。 (1) 管理模式 分散管理型:各部门分散开展数据应用&#xf…

大数据应用于各个行业,大数据在各行各业的具体应用是什么?

大数据无处不在,大数据应用于各个行业,包括金融、汽车、餐饮、电信、能源、体能和娱乐等在内的社会各行各业都已经融入了大数据的印迹,下面详细介绍一下大数据在各行各业的具体应用。      制造业,利用工业大数据提升制造业水…

大数据应用的重要性体现在方方面面

大数据应用的重要性,自全国提出“数据中国”的概念以来,我们周围默默地在发挥作用的大数据逐渐深入人们的心中,大数据的应用也越来越广泛,具体到金融、汽车、餐饮、电信、能源、体育和娱乐等领域,下面就通过本文&#…

4大案例分析金融机构的大数据应用

就“大数据金融”思维利用而言,国外金融机构有着十足丰富的体现,已经将大数据技术在风险控制、运营管理、销售支持及商业模式创新等领域进行了全面的尝试。 案例一:汇丰银行-风险管理 汇丰银行在防范信用卡和借记卡欺诈的基础上,利…

金融业大数据应用场景

如果能够引入外部数据,还可以进一步加快数据价值的变现。外部数据中比较好的有社交数据、电商交易数据、移动大数据、运营商数据、工商司法数据、公安数据、教育数据和银联交易数据等。 大数据在金融行业的应用范围较广,典型的案例有花旗银行利用 IBM 沃…

【行业|分析】大数据对于银行七大应用

如今,Hadoop几乎存在于各个方面,其通过利用大数据来分析信息和增加竞争力。许多金融机构和公司已经开始使用Hadoop成功地解决问题,即便他们本没有计划这样做。因为如果他们不这样做,就会面临市场份额损失的巨大风险。以下是一些特别有趣且重要的大数据和Hadoop用例。 诈骗侦…

银行大数据风控平台的建设要点与应用

金融行业是经营风险的行业,风险控制能力是金融机构的核心竞争力。通常而言,金融机构一般是通过给客户的信用状况评分来计量贷款违约的可能性,并通过客户的风险水平进行利率定价。 而传统的信用测算主要是利用历史借贷数据和财务数据对借款人的…

浅谈大数据如何应用?

大数据所面临的五大问题中最后一个是大数据应用,也是大数据问题的具象和最终展现形式。如果用更高度的概括来表述大数据的生命周期,可以归纳为:大数据来源大数据技术大数据应用。三者缺一不可、彼此相承,见下图: ** …

银行大数据风控管理针对哪些应用场景?

银行是经营风险的企业,在风险识别、衡量、定价和防范等方面的能力水平,是判断银行是否具备核心竞争力的关键。随着社会信息化、数字化体系建设,银行风险管理也必将迎来“数智化”时代。 其实,银行业务的申请、交易、营销等环节都…

大数据技术在银行业应用中,主要有哪些优势,面临哪些难题?

大数据技术在银行业应用中的主要优势与难题 经济社会的三个重要组成要素:产品、信息、资金渗透于互联网时代的诸多环节,互联网时代的激烈竞争当中,电商、银行、物流三大类别企业代表着三种要素的重要占有者,三者都希望成为主宰着…