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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 镁光闪存颗粒对照表_详解闪存颗粒的种类

    镁光闪存颗粒对照表_详解闪存颗粒的种类固态硬盘的存储颗粒从目前来看主要分为SLC,MLC,TLC,QLC.这四种存储颗粒的区别主要体现在那方面,以下我们就从价格,使用寿命,应用场合来划分.SLCMLCTLCQLC示意图SLC:单层次存储单元SLC=Single-LevelCell,即1bit/cell,速度快寿命最长,价格贵(约MLC3倍以上的价格),约10万次擦写寿命.是目前使用寿命最高的颗粒,由于价格贵,产能少,…

    2022年6月22日
    100
  • ubuntu常见问题指南 新手发问前必看 08/03/27 更新

    ubuntu常见问题指南 新手发问前必看 08/03/27 更新

    2021年8月7日
    64
  • Docker常用命令大全「建议收藏」

    Docker常用命令大全「建议收藏」Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化、容器是完全使用沙箱机制,彼此之间没有任何接口。一个完整的Docker有以下几个部分组成:DockerClient客户端Docker守护进程守护进程Docker镜像镜像Docker容器容器下面是Docker的常用命令:Docker常用命令大全容器生命周期管理命令runstart/stop/restart

    2022年9月18日
    3
  • leetcode 三数之和_leetcode数组交集

    leetcode 三数之和_leetcode数组交集原题链接给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[] 提示:0 <= nums.length <= 300

    2022年8月8日
    6
  • intlidea 2022.01激活码【2022免费激活】

    (intlidea 2022.01激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~40ZKSWCX8G-eyJsaWNlb…

    2022年4月2日
    145
  • Redis之压缩列表ziplist

    Redis是基于内存的nosql,有些场景下为了节省内存redis会用“时间”换“空间”。ziplist就是很典型的例子。ziplist是list键、hash键以及zset键的底层实现之一(3.0之后list键已经不直接用ziplist和linkedlist作为底层实现了,取而代之的是quicklist)这些键的常规底层实现如下:list键:双向链表 hash键:字典di…

    2022年4月9日
    80

发表回复

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

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