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)
上一篇 2022年4月3日 下午4:35
下一篇 2022年4月3日 下午5:00


相关推荐

  • [CentOS]离线安装gcc/gcc-c++-「建议收藏」

    [CentOS]离线安装gcc/gcc-c++-「建议收藏」环境CentOS7.5官方地址:https://gcc.gnu.org/releases.html镜像站点1:http://mirrors.aliyun.com/centos/7/os/x86_64/Packages/镜像站点2:https://vault.centos.org/7.5.1804/os/x86_64/Packages/gcc:4.8.5安装GCCgcc依赖包清单如下(镜像站下载)cpp-4.8.5-44.el7.x86_64.rpmgcc-4.8.5-44.el7.

    2022年5月9日
    619
  • OpenClaw 配置飞书教程(直接更新,不含安装openclaw)

    OpenClaw 配置飞书教程(直接更新,不含安装openclaw)

    2026年3月13日
    2
  • 浅谈Spring之@Nullable、@NonNull注解

    浅谈Spring之@Nullable、@NonNull注解NonNull 可以标注在方法 字段 参数之上 表示对应的值不可以为空 Nullable 注解可以标注在方法 字段 参数之上 表示对应的值可以为空以上两个注解在程序运行的过程中不会起任何作用 只会在 IDE 编译器 FindBugs 检查 生成文档的时候有做提示 我使用的 IDE 是 STS 不会做自动的检查 只有安装了 FindBugs 插件并运行后会做对应的提示

    2026年3月17日
    1
  • Netty_dubbo和spring cloud区别

    Netty_dubbo和spring cloud区别Netty

    2022年4月21日
    97
  • KindEditor编辑器API文档

    KindEditor编辑器API文档一 变量 KE scriptPathki js 的路径 数据类型 StringKE browser 浏览器类型和版本 分别为 KE browser IE KE browser WEBKIT KE browser GECKO KE browser OPERA KE browser VERSION 数据类型 Object 注 3 4 以前版本直接返回字符串 分别为

    2026年3月17日
    2
  • Java微信小程序支付篇

    Java微信小程序支付篇在做完一个仿美团的应用 我将其中涉及到的一些技术点进行总结和整理 当下次遇到类似的问题就能省下不少时间 避免踩坑 一 微信小程序支付的使用微信支付有官方提供的 SDK 但要自己处理的东西比较多 我使用的是一个别人封装过的 SDKhttps github com Wechat Group WxJava 同事推荐我用的 要如何使用呢 首先引入依赖 dependency groupId com github binarywang groupId dependency

    2026年3月17日
    2

发表回复

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

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