JAVA高并发的三种实现

提到锁,大家肯定想到的是sychronized关键字。是用它可以解决一切并发问题,但是,对于系统吞吐量要求更高的话,我们这提供几个小技巧。帮助大家减小锁颗粒度,提高并发能力。初级技巧-乐观锁乐观锁使用的场景是,读不会冲突,写会冲突。同时读的频率远大于写。悲观锁的实现:悲观的认为所有代码执行都会有并发问题,所以将所有代码块都用sychronized锁住乐观锁的实现:…

大家好,又见面了,我是你们的朋友全栈君。

提到锁,大家肯定想到的是sychronized关键字。是用它可以解决一切并发问题,但是,对于系统吞吐量要求更高的话,我们这提供几个小技巧。帮助大家减小锁颗粒度,提高并发能力。

初级技巧-乐观锁

乐观锁使用的场景是,读不会冲突,写会冲突。同时读的频率远大于写。

 悲观锁的实现

JAVA高并发的三种实现

悲观的认为所有代码执行都会有并发问题,所以将所有代码块都用sychronized锁住

乐观锁的实现

JAVA高并发的三种实现

乐观的认为在读的时候不会产生冲突为题,在写时添加锁。所以解决的应用场景是读远大于写时的场景。

中级技巧-String.intern()

乐观锁不能很好的解决大量的写冲突的问题,但是很多场景下,锁只是针对某个用户或者某个订单。 比如一个用户先创建session,才能进行后面的操作,但是由于网络的问题,创建session的请求和后续请求几乎同时到达,而并行线程可能会先处理后面的请求。一般情况需要对用户sessionMap加锁,比如上面的乐观锁。在这样的场景下,可以将锁限定在用户本身上,即原来的

JAVA高并发的三种实现

这个比较类似行锁和数据库表锁的概念。显然行锁的并发能力比表锁的高很多。

实用String.intern();是这种方式的具体实现。类String维护了一个字符串池。当调用intern方法时,如果池已经包含一个等于此String对象的字符串(该对象由equals(Object)方法确定),则返回池中的字符串。可见,当String 相同时,总返回同一个对象,因此就实现了对同一用户加锁。由于所的颗粒度局限于具体用户,使得系统获得最大程度的并发。

JAVA高并发的三种实现

CopyOnWriteMap?

 

既然说到了“类似于数据库中的行锁的概念”,就不得不提一下MVCC,Java中CopyOnWrite类实现了MVCC。Copy On Write是这样一种机制。当我们读取共享数据的时候,直接读取,不需要同步。当我们修改数据的时候,我们就把当前数据Copy一份副本,然后在这个副本 上进行修改,完成之后,再用修改后的副本,替换掉原来的数据。这种方法就叫做Copy On Write。

 

但是,,,JDK并没有提供CopyOnWriteMap,为什么?下面有个很好的回答,那就是已经有了ConcurrentHashMap,为什么还需要CopyOnWriteMap?

 

高级技巧 – 类ConcurrentHashMap

String.inter()的缺陷是类 String 维护一个字符串池是放在JVM perm区的,如果用户数特别多,导致放入字符串池的String不可控,有可能导致OOM错误或者过多的Full GC。怎么样能控制锁的个数,同时减小粒度锁呢?直接使用Java ConcurrentHashMap?或者你想加入自己更精细的控制?那么可以借鉴ConcurrentHashMap的方式,将需要加锁的对象分为多个bucket,每个bucket加一个锁,伪代码如下:

JAVA高并发的三种实现

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/124625.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • LoadRunner教程01:性能测试常见用语

    LoadRunner教程01:性能测试常见用语1、并发用户数量:常见的错误理解:使用系统的全部用户数量使用系统的全部在线用户数量正确理解:与服务器进行交互的在线用户数量2、请求响应时间:从client发出请求到得到响应的整个时间,一般包括网络响应时间+server的响应时间3、事务请求响应时间:完成这个事务所用的时间,这个是性能测试中重点关注的指标4、吞吐率:单位时间在网络上传输的数据量(从服务端返

    2022年5月10日
    38
  • Linux Platform devices 平台设备驱动

    Linux Platform devices 平台设备驱动platform平台设备驱动是基于设备总线驱动模型的,它只不过是将device进一步封装成为platform_device,将device_driver进一步封装成为platform_device_driver,前面已经分析过设备总线驱动模型,关于device与device_driver的注册过程以及它们在sysfs文件系统中的层次关系就不在分析,本文重点分析platform平台

    2022年7月24日
    10
  • cad制图常用命令_cad制图注意事项及细节

    cad制图常用命令_cad制图注意事项及细节AutoCAD常见命令总结1.选项:OP2.缩放:z3.鼠标操作:滚动中键缩放,按住中键移动4.选择:实线,虚线。5.直线:线性(标记),对象捕捉。6.尺寸线:几何尺寸,定位尺寸。从左,上标记。7.标注:规范标注(尺寸界限与几何线之间不能重合),快速标注(按空格),连续标注(需提前标好一个)。8.直线定位法。9.画斜线公式:@长度……

    2025年11月27日
    4
  • java源文件扩展名_java源文件名的后缀是什么?

    java源文件扩展名_java源文件名的后缀是什么?java源文件名的后缀是:“.java”。java编译后的文件扩展名是:“.class”;“class”文件全名称为“Javaclass”文件,主要在平台无关性和网络移动性方面使Java更适合网络。java源文件扩展名是.java。java编译后的文件扩展名是.class。我们编好的Java源程序保存为.java后缀,然后再用javac(Java语言的编译器)进行编译,生成后缀名为.class的…

    2022年7月7日
    31
  • spring源码分析之事务transaction上篇

    spring源码分析之事务transaction上篇

    2021年8月4日
    56
  • 记一次某网站实战

    记一次某企业实战0x00前言近段时间来也没怎么更新过博客,在这里就来水篇文章吧。前段时间一直在做项目,也来分享并且记录一下自己的一些成果,和一些小思路。0x01信息收集渗透的第一步肯定是

    2021年12月11日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号