iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >在Java并发场景中有哪些锁
  • 632
分享到

在Java并发场景中有哪些锁

2023-06-16 23:06:35 632人浏览 薄情痞子
摘要

这篇文章主要介绍了在java并发场景中有哪些锁,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。01.乐观锁 vs 悲观锁乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不

这篇文章主要介绍了在java并发场景中有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

01.乐观锁 vs 悲观锁

乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度,在Java和数据库中都有此概念对应的实际应用。

1.乐观锁

顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。

乐观锁适用于多读的应用类型,乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法,Java原子类中的递增操作就通过CAS自旋实现的。

CAS全称 Compare And  Swap(比较与交换),是一种无锁算法。在不使用锁(没有线程被阻塞)的情况下实现多线程之间的变量同步。java.util.concurrent包中的原子类就是通过CAS来实现了乐观锁。

简单来说,CAS算法有3个三个操作数:

  • 需要读写的内存值 V。

  • 进行比较的值 A。

  • 要写入的新值 B。

当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则返回V。这是一种乐观锁的思路,它相信在它修改之前,没有其它线程去修改它;而Synchronized是一种悲观锁,它认为在它修改之前,一定会有其它线程去修改它,悲观锁效率很低。

2.悲观锁

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

传统的MySQL关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。详情可以参考:阿里P8架构师谈:Mysql行锁、表锁、悲观锁、乐观锁的特点与应用

再比如上面提到的Java的同步synchronized关键字的实现就是典型的悲观锁。

在Java并发场景中有哪些锁

3.总之:

悲观锁适合写操作多的场景,先加锁可以保证写操作时数据正确。

乐观锁适合读操作多的场景,不加锁的特点能够使其读操作的性能大幅提升。

02.公平锁 vs 非公平锁

1.公平锁

就是很公平,在并发环境中,每个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的***个,就占有锁,否则就会加入到等待队列中,以后会按照FIFO的规则从队列中取到自己。

公平锁的优点是等待锁的线程不会饿死。缺点是整体吞吐效率相对非公平锁要低,等待队列中除***个线程以外的所有线程都会阻塞,CPU唤醒阻塞线程的开销比非公平锁大。

2.非公平锁

上来就直接尝试占有锁,如果尝试失败,就再采用类似公平锁那种方式。

非公平锁的优点是可以减少唤起线程的开销,整体的吞吐效率高,因为线程有几率不阻塞直接获得锁,CPU不必唤醒所有线程。缺点是处于等待队列中的线程可能会饿死,或者等很久才会获得锁。

在Java并发场景中有哪些锁

3.典型应用:

java jdk并发包中的ReentrantLock可以指定构造函数的boolean类型来创建公平锁和非公平锁(默认),比如:公平锁可以使用new  ReentrantLock(true)实现。

03.独享所 vs 共享锁

1.独享锁

是指该锁一次只能被一个线程所持有。

2.共享锁

是指该锁可被多个线程所持有。

3.比较

对于Java  ReentrantLock而言,其是独享锁。但是对于Lock的另一个实现类ReadWriteLock,其读锁是共享锁,其写锁是独享锁。

读锁的共享锁可保证并发读是非常高效的,读写,写读 ,写写的过程是互斥的。

独享锁与共享锁也是通过AQS来实现的,通过实现不同的方法,来实现独享或者共享。

4.AQS

抽象队列同步器(AbstractQueuedSynchronizer,简称AQS)是用来构建锁或者其他同步组件的基础框架,它使用一个整型的volatile变量(命名为state)来维护同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。

在Java并发场景中有哪些锁

concurrent包的实现结构如上图所示,AQS、非阻塞数据结构和原子变量类等基础类都是基于volatile变量的读/写和CAS实现,而像Lock、同步器、阻塞队列、Executor和并发容器等高层类又是基于基础类实现。

04.分段锁

分段锁其实是一种锁的设计,并不是具体的一种锁,对于ConcurrentHashMap而言,其并发的实现就是通过分段锁的形式来实现高效的并发操作。

我们以ConcurrentHashMap来说一下分段锁的含义以及设计思想,ConcurrentHashMap中的分段锁称为Segment,它即类似于HashMap(JDK7与JDK8中HashMap的实现)的结构,即内部拥有一个Entry数组,数组中的每个元素又是一个链表;同时又是一个ReentrantLock(Segment继承了ReentrantLock)。

当需要put元素的时候,并不是对整个hashmap进行加锁,而是先通过hashcode来知道他要放在那一个分段中,然后对这个分段进行加锁,所以当多线程put的时候,只要不是放在一个分段中,就实现了真正的并行的插入。

但是,在统计size的时候,可就是获取hashmap全局信息的时候,就需要获取所有的分段锁才能统计。

分段锁的设计目的是细化锁的粒度,当操作不需要更新整个数组的时候,就仅仅针对数组中的一项进行加锁操作。

感谢你能够认真阅读完这篇文章,希望小编分享的“在Java并发场景中有哪些锁”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: 在Java并发场景中有哪些锁

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

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

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

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

下载Word文档
猜你喜欢
  • 在Java并发场景中有哪些锁
    这篇文章主要介绍了在Java并发场景中有哪些锁,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。01.乐观锁 vs 悲观锁乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不...
    99+
    2023-06-16
  • MySQL中有哪些加锁场景
    MySQL中有哪些加锁场景,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。如下图所示,数据库的隔离等级,SQL 语句和当前数据库...
    99+
    2024-04-02
  • Go并发的应用场景有哪些
    以下是一些常见的Go并发的应用场景: 服务器编程:Go语言在服务器端编程中具有很高的并发性能,可用于构建高性能的Web应用程序、...
    99+
    2023-10-25
    Go
  • java读写锁的使用场景有哪些
    当多个线程需要读取共享数据,但只有少数线程需要写入数据时,使用读写锁可以提高并发性能。 当对共享数据的读操作比写操作频繁时,...
    99+
    2024-04-03
    java
  • java可重入锁的使用场景有哪些
    可重入锁是指同一个线程可以多次获得同一把锁,在释放锁之前需要释放相同次数的锁。可重入锁的使用场景包括:1. 递归函数:当一个递归函数...
    99+
    2023-09-11
    java
  • redis锁的应用场景有哪些
    Redis锁的应用场景有以下几个:1. 分布式锁:在分布式系统中,多个节点需要共享某个资源时,使用Redis锁可以保证在同一时间只有...
    99+
    2023-08-12
    redis
  • 二维码技术在Java开发中有哪些应用场景?
    随着移动互联网的普及,二维码技术作为一种方便快捷的信息交互方式,被广泛应用于各行各业。在Java开发中,二维码技术同样具有重要的应用场景。本文将介绍二维码技术在Java开发中的应用场景,并且提供相应的演示代码。 一、二维码技术简介 二维码...
    99+
    2023-09-18
    二维码 开发技术 对象
  • python并发场景锁如何使用
    本文小编为大家详细介绍“python并发场景锁如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“python并发场景锁如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。加锁的原因我们明白了锁的原理,不禁...
    99+
    2023-07-02
  • python并发场景锁的使用方法
    目录前言加锁的原因代码实现可重入锁总结前言 如果你学过操作系统,那么对于锁应该不陌生。锁的含义是线程锁,可以用来指定某一个逻辑或者是资源同一时刻只能有一个线程访问。这个很好理解,就好...
    99+
    2024-04-02
  • Java高并发场景下的缓存常见的问题有哪些
    这篇文章主要讲解了“Java高并发场景下的缓存常见的问题有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java高并发场景下的缓存常见的问题有哪些”吧!一、缓存一致性问题当数据时效性要求...
    99+
    2023-06-05
  • java中lamda的应用场景有哪些
    集合操作:使用lamda表达式可以简化集合的遍历和操作,比如筛选、排序、映射等。 线程处理:使用lamda表达式可以方便地创...
    99+
    2024-03-11
    java
  • java中aop的应用场景有哪些
    Java中AOP(面向切面编程)的应用场景包括:1. 日志记录:可以通过AOP将日志记录代码横切到各个业务方法中,实现统一的日志记录...
    99+
    2023-10-11
    java
  • Java中attribute的应用场景有哪些
    在Java中,attribute(属性)可以用来描述一个对象的特征、状态或者行为。以下是一些常见的Java中attribute的应用...
    99+
    2023-10-18
    Java
  • java中method的应用场景有哪些
    封装代码逻辑:将一系列相关的代码封装到一个方法中,可以提高代码的可读性和可维护性。 提高代码的重用性:定义一个方法后,可以在...
    99+
    2024-03-12
    java
  • java中ThreadLocal的使用场景有哪些
    今天就跟大家聊聊有关java中ThreadLocal的使用场景有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。常用的java框架有哪些1.SpringMVC,Spring Web...
    99+
    2023-06-14
  • java中SPI的使用场景有哪些
    这期内容当中小编将会给大家带来有关java中SPI的使用场景有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现...
    99+
    2023-06-14
  • java中dictionary的应用场景有哪些
    在Java中,Dictionary类是一个抽象类,通常用于存储键值对数据。它具有以下几种常见的应用场景: 缓存数据:可以使用Di...
    99+
    2024-03-04
    java
  • Java中WeakHashMap的使用场景有哪些
    Java中WeakHashMap是一种可以自动删除不再使用的键值对的Map实现,它的使用场景包括:1. 缓存:WeakHashMap...
    99+
    2023-09-29
    Java
  • java中swt的应用场景有哪些
    SWT(Standard Widget Toolkit)是一种用于构建图形用户界面的工具包,它类似于Swing和AWT,但是在实现上...
    99+
    2024-03-06
    java
  • 打包对象在 Java 开发技术中的应用场景有哪些?
    Java 是一种面向对象的编程语言,其中对象是 Java 编程的核心。在 Java 中,对象是由类定义的,它们包含了数据和方法。在 Java 开发技术中,打包对象是一个非常重要的概念,它可以帮助开发者简化代码的编写和管理,并提高代码的可维...
    99+
    2023-07-20
    开发技术 打包 对象
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作