广告
返回顶部
首页 > 资讯 > 精选 >Java 8中的StampedLock是否将是解决同步问题的关键
  • 722
分享到

Java 8中的StampedLock是否将是解决同步问题的关键

2023-06-17 08:06:03 722人浏览 安东尼
摘要

Java 8中的StampedLock是否将是解决同步问题的关键,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java8就像一个宝藏,一个小的api改进,也足与写一篇文章,比如

Java 8中的StampedLock是否将是解决同步问题的关键,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

Java8就像一个宝藏,一个小的api改进,也足与写一篇文章,比如同步,一直是多线程并发编程的一个老话题,相信没有人喜欢同步的代码,这会降低应用的吞吐量等性能指标,最坏的时候会挂起死机,但是即使这样你也没得选择,因为要保证信息的正确性。所以小编决定将从synchronized、Lock到Java8新增的StampedLock进行对比分析,相信StampedLock不会让大家失望。

synchronized

在java5之前,实现同步主要是使用synchronized。它是Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

有四种不同的同步块:

  1. 实例方法

  2. 静态方法

  3. 实例方法中的同步块

  4. 静态方法中的同步块

大家对此应该不陌生,所以不多讲了,以下是代码示例

synchronized(this)  // do operation  }

小结:在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级,但是随着Java SE1.6对Synchronized进行了各种优化之后,性能上也有所提升。

Lock

它是Java 5在java.util.concurrent.locks新增的一个API。

Lock是一个接口,核心方法是lock(),unlock(),tryLock(),实现类有ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock;

ReentrantReadWriteLock, ReentrantLock 和synchronized锁都有相同的内存语义。

与synchronized不同的是,Lock完全用Java写成,在java这个层面是无关JVM实现的。Lock提供更灵活的锁机制,很多synchronized 没有提供的许多特性,比如锁投票,定时锁等候和中断锁等候,但因为lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中

下面是Lock的一个代码示例

rwlock.writeLock().lock();  try {  // do operation  } finally {  rwlock.writeLock().unlock();  }

小结:比synchronized更灵活、更具可伸缩性的锁定机制,但不管怎么说还是synchronized代码要更容易书写些

StampedLock

它是java8在java.util.concurrent.locks新增的一个API。

ReentrantReadWriteLock 在沒有任何读写锁时,才可以取得写入锁,这可用于实现了悲观读取(Pessimistic Reading),即如果执行中进行读取时,经常可能有另一执行要写入的需求,为了保持同步,ReentrantReadWriteLock 的读取锁定就可派上用场。

然而,如果读取执行情况很多,写入很少的情况下,使用 ReentrantReadWriteLock 可能会使写入线程遭遇饥饿(Starvation)问题,也就是写入线程吃吃无法竞争到锁定而一直处于等待状态。

StampedLock控制锁有三种模式(写,读,乐观读),一个StampedLock状态是由版本和模式两个部分组成,锁获取方法返回一个数字作为票据stamp,它用相应的锁状态表示并控制访问,数字0表示没有写锁被授权访问。在读锁上分为悲观锁和乐观锁。

所谓的乐观读模式,也就是若读的操作很多,写的操作很少的情况下,你可以乐观地认为,写入与读取同时发生几率很少,因此不悲观地使用完全的读取锁定,程序可以查看读取资料之后,是否遭到写入执行的变更,再采取后续的措施(重新读取变更信息,或者抛出异常) ,这一个小小改进,可大幅度提高程序的吞吐量!!

下面是java doc提供的StampedLock一个例子

class Point {     private double x, y;     private final StampedLock sl = new StampedLock();     void move(double deltaX, double deltaY) { // an exclusively locked method       long stamp = sl.writeLock();       try {         x += deltaX;         y += deltaY;       } finally {         sl.unlockWrite(stamp);       }     }    //下面看看乐观读锁案例     double distanceFromOrigin() { // A read-only method       long stamp = sl.tryOptimisticRead(); //获得一个乐观读锁       double currentX = x, currentY = y; //将两个字段读入本地局部变量       if (!sl.validate(stamp)) { //检查发出乐观读锁后同时是否有其他写锁发生?          stamp = sl.readLock(); //如果没有,我们再次获得一个读悲观锁          try {            currentX = x; // 将两个字段读入本地局部变量            currentY = y; // 将两个字段读入本地局部变量          } finally {             sl.unlockRead(stamp);          }       }       return Math.sqrt(currentX * currentX + currentY * currentY);     }  //下面是悲观读锁案例     void moveIfAtOrigin(double newX, double newY) { // upgrade       // Could instead start with optimistic, not read mode       long stamp = sl.readLock();       try {         while (x == 0.0 && y == 0.0) { //循环,检查当前状态是否符合           long ws = sl.tryConvertToWriteLock(stamp); //将读锁转为写锁           if (ws != 0L) { //这是确认转为写锁是否成功             stamp = ws; //如果成功 替换票据             x = newX; //进行状态改变             y = newY; //进行状态改变             break;           }           else { //如果不能成功转换为写锁             sl.unlockRead(stamp); //我们显式释放读锁             stamp = sl.writeLock(); //显式直接进行写锁 然后再通过循环再试           }         }       } finally {         sl.unlock(stamp); //释放读锁或写锁       }     }   }

小结:

StampedLock要比ReentrantReadWriteLock更加廉价,也就是消耗比较小。

StampedLock与ReadWriteLock性能对比

下图是和ReadWritLock相比,在一个线程情况下,是读速度其4倍左右,写是1倍。

Java 8中的StampedLock是否将是解决同步问题的关键

下图是六个线程情况下,读性能是其几十倍,写性能也是近10倍左右:

Java 8中的StampedLock是否将是解决同步问题的关键

下图是吞吐量提高:

Java 8中的StampedLock是否将是解决同步问题的关键

总结

synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定;

ReentrantLock、ReentrantReadWriteLock,、StampedLock都是对象层面的锁定,要保证锁定一定会被释放,就必须将unLock()放到finally{}中;

StampedLock 对吞吐量有巨大的改进,特别是在读线程越来越多的场景下;

StampedLock有一个复杂的API,对于加锁操作,很容易误用其他方法;

当只有少量竞争者的时候,synchronized是一个很好的通用的锁实现;

当线程增长能够预估,ReentrantLock是一个很好的通用的锁实现;

StampedLock 可以说是Lock的一个很好的补充,吞吐量以及性能上的提升足以打动很多人了,但并不是说要替代之前Lock的东西,毕竟他还是有些应用场景的,起码API比StampedLock容易入手,下篇博文争取更新快一点,可能会是Nashorn的内容,这里允许我先卖个关子。。。

原文链接:Http://my.oschina.net/benhaile/blog/264383

看完上述内容,你们掌握Java 8中的StampedLock是否将是解决同步问题的关键的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: Java 8中的StampedLock是否将是解决同步问题的关键

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

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

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

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

下载Word文档
猜你喜欢
  • Java 8中的StampedLock是否将是解决同步问题的关键
    Java 8中的StampedLock是否将是解决同步问题的关键,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java8就像一个宝藏,一个小的API改进,也足与写一篇文章,比如...
    99+
    2023-06-17
  • JavaScript打包的问题:Java是否能够解决?
    随着前端技术的不断发展,JavaScript已经成为了前端开发的主要语言之一。在开发过程中,我们通常需要将多个JavaScript文件打包成一个文件,以便于网页加载。然而,这个过程并不总是那么顺利。在本文中,我们将探讨JavaScript...
    99+
    2023-08-18
    响应 打包 javascript
  • Spring 中的同步机制能否解决多线程问题?
    Spring是一个流行的Java开发框架,为Java开发者提供了许多便利的功能和工具。然而,当我们在使用Spring框架进行多线程编程时,我们是否需要考虑同步机制来解决多线程问题呢?这是一个值得讨论的问题。 首先,我们需要了解什么是同步机制...
    99+
    2023-09-21
    面试 同步 spring
  • Java编程中同步关键字的作用是什么?
    在Java编程中,同步关键字是非常重要的概念。它可以保证线程的安全性,避免出现数据竞争等问题。在本文中,我们将详细介绍同步关键字的作用以及如何使用它来确保程序的正确性。 同步关键字的作用 在Java中,同步关键字的作用是保证线程的安全...
    99+
    2023-11-11
    编程算法 同步 关键字
  • Java中的AQS同步队列问题怎么解决
    这篇文章主要介绍“Java中的AQS同步队列问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java中的AQS同步队列问题怎么解决”文章能帮助大家解决问题。AQS 同步队列1、AQS 介绍...
    99+
    2023-07-02
  • Java框架和Linux:同步的问题和解决方案是什么?
    Java是一种流行的编程语言,被广泛应用于Web应用程序、企业级应用程序和移动应用程序。而Linux则是一个开源的操作系统,被广泛应用于服务器、桌面和嵌入式设备等领域。在这两个领域中,同步是一个非常重要的问题。本文将介绍Java框架和Li...
    99+
    2023-09-18
    框架 linux 同步
  • 大数据存储:Python是解决问题的关键吗?
    随着数据量的不断增长,大数据存储已经成为了现代社会的一个重要问题。对于大数据的存储,Python作为一门高效且易于学习的编程语言,能否成为解决问题的关键呢?本文将探讨Python在大数据存储中的应用,并通过演示代码来展示Python的优势...
    99+
    2023-11-04
    存储 面试 大数据
  • Java 面试中常见的同步问题是什么?
    在 Java 开发中,多线程是一个常见的话题。多线程的出现,使得程序能够更加高效地运行。但是多线程也会引发一些问题,比如线程安全和同步问题。在 Java 面试中,同步问题也是一个经常被问到的话题。本文将介绍 Java 面试中常见的同步问题...
    99+
    2023-09-22
    面试 同步 spring
  • 容器同步技术能否解决 PHP 应用程序中的性能问题?
    随着互联网技术的不断发展,PHP应用程序的使用越来越广泛。然而,PHP应用程序在高并发、大流量的情况下,往往会遇到性能问题。为了解决这个问题,容器同步技术应运而生。那么,容器同步技术能否解决PHP应用程序中的性能问题呢?本文将对此进行探讨。...
    99+
    2023-09-06
    同步 容器 关键字
  • PHP中存储同步和重定向的问题解决方案是什么?
    在使用PHP进行开发的过程中,存储同步和重定向是经常遇到的问题。这两个问题都与HTTP协议密切相关。在这篇文章中,我们将介绍PHP中存储同步和重定向的问题,以及如何解决它们。 什么是存储同步? 当用户在网页上填写了表单并提交后,PHP需要...
    99+
    2023-10-06
    存储 同步 重定向
  • 你知道如何使用Python同步关键字来解决框架中的线程安全问题吗?
    当我们使用多线程编程时,线程安全问题是不可避免的。Python提供了一种同步机制来解决线程安全问题——同步关键字。本文将介绍如何使用Python同步关键字来解决框架中的线程安全问题。 一、Python同步关键字概述 Python中的同步关键...
    99+
    2023-06-24
    同步 关键字 框架
  • IDE 中的 Java 同步问题:如何有效地解决并发编程难题?
    Java 是一门广泛使用的编程语言,其强大的并发编程能力使得它在大规模应用程序中得到了广泛的应用。然而,Java 中的并发编程也面临着一些挑战,其中之一就是同步问题。在本文中,我们将探讨 Java 中的同步问题以及如何有效地解决这些问题。 ...
    99+
    2023-06-26
    同步 ide http
  • ASP函数path同步的常见问题及解决方案是什么?
    在ASP开发中,我们经常会使用到path函数,它是用来获取当前脚本的物理路径的函数。但是,在使用path函数时,我们常常会遇到一些问题,比如路径同步不正确、路径分隔符错误等等。本文将为大家介绍path函数的常见问题及解决方案。 1.路径同...
    99+
    2023-09-30
    函数 path 同步
  • Python API 数组同步的常见问题及解决方案是什么?
    随着人工智能和数据分析的发展,Python 成为了最受欢迎的编程语言之一。Python 提供了各种数据结构来处理数据,其中数组是一种最常用的数据结构之一。但是在使用 Python 中的数组时,我们经常会遇到同步问题,这些问题可能会影响我们...
    99+
    2023-08-17
    api 数组 同步
  • LeetCode 题库中的接口问题:你的解决方案是否够优秀?
    LeetCode 题库是程序员们常用的一个刷题平台,它提供了大量的算法和数据结构题目,帮助程序员们提高解决问题的能力。然而,LeetCode 题库中也存在接口问题,这些问题可能会影响程序的性能和可读性。在本文中,我们将探讨这些接口问题,并...
    99+
    2023-06-17
    leetcode 重定向 接口
  • Laravel中是否有与Python Windows异步编程相关的解决方案?
    Laravel是一款流行的PHP框架,它提供了许多功能和工具,使得开发人员可以轻松地创建高质量的Web应用程序。在Laravel中,异步编程是一个非常重要的话题,因为它可以帮助我们提高Web应用程序的性能和可扩展性。但是,对于一些开发人员来...
    99+
    2023-11-08
    windows 异步编程 laravel
  • Java中的重定向和路径关键字:如何调试和解决问题?
    Java是一种广泛使用的编程语言,它在开发Web应用程序、桌面应用程序、移动应用程序等方面都有广泛的应用。在Java编程中,重定向和路径关键字是必不可少的概念。重定向是将用户从一个URL重定向到另一个URL,而路径关键字则是指在Java应用...
    99+
    2023-10-11
    重定向 关键字 path
  • 数组同步的编程算法:ASP中的常见问题和解决方案是什么?
    数组同步的编程算法:ASP中的常见问题和解决方案 数组同步是一种常见的编程算法,它用于确保两个或多个数组在大小和内容上保持同步。在ASP中,使用数组同步是一个常见的任务,但是可能会遇到一些问题和挑战。本文将介绍ASP中数组同步的常见问题和解...
    99+
    2023-09-19
    数组 同步 编程算法
  • LeetCode中Java路径问题的解决方案是什么?
    LeetCode是一个著名的面试题库和算法题库,主要提供各种编程语言的算法题目,其中Java是其中一个主要支持的编程语言。在LeetCode中,路径问题是一个非常常见的问题,包括二叉树路径、图的路径、字符串路径等等,而这些问题的解决方案也非...
    99+
    2023-09-20
    path leetcode 响应
  • JAVA常见中文问题的解决方案是怎样的呢
    JAVA常见中文问题的解决方案是怎样的呢,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JAVA常见中文问题的解决方法以下解决方案是笔者在日常生活中遇到的,希望能...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作