首页 > 编程语言 >JAVA高并发的三种实现

JAVA高并发的三种实现

时间:2024-04-10 15:12:25浏览次数:17  
标签:ConcurrentHashMap 加锁 JAVA String 用户 并发 三种 字符串

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

初级技巧-乐观锁

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

 悲观锁的实现

 

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

乐观锁的实现

 

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

中级技巧-String.intern()

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

 

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

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

 

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加一个锁,伪代码如下:

 

标签:ConcurrentHashMap,加锁,JAVA,String,用户,并发,三种,字符串
From: https://www.cnblogs.com/vue1168/p/18126065

相关文章

  • Java 方法重载
    方法名相同,但各自的参数不同,称为方法重载(Overload)注意:方法重载的返回值类型通常都是相同的。方法重载的目的是,功能类似的方法使用同一名字,更容易记住,因此,调用起来更简单。举个例子,String类提供了多个重载方法indexOf(),可以查找子串:intindexOf(intch):根据字符的Unicode......
  • JAVA语言学习-Day7
    概述计算机网络:将地理位置不同的具有独立功能的多台计算机及其外部设备,通过线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。网络编程的目的:传播交流信息,数据交换。通信想达到这个效果需要什么:通过ip地址及端口,定......
  • Python生成excel文件的三种方式
    在我们做平常工作中都会遇到操作excel,那么今天写一篇,如何通过python操作excel。当然python操作excel的库有很多,比如pandas,xlwt/xlrd,openpyxl等,每个库都有不同的区别,具体的区别,大家一起来看看吧~xlwt/xlrdxlrd是对于Excel进行读取,xlrd操作的是xls/xlxs格式的excelxlwt......
  • [Java]Lambda表达式
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18032049出自【进步*于辰的博客】启发博文:《Lambda表达式超详细总结》(转发)。这是我系统学习Lambda表达式时参考的文章。在下文中,我会引用这篇博文中的一些资源,如:图片、阐述......
  • javaScript-sort()排序
    在写题的时候要以列表中的某个参数进行排序letlist=[{age:10,name:'x1'},{age:8,name:'x2'},{age:20,name:'x3'},{age:9,name:'x4'},{age:30,name:'x5'},]就用到了list.sort((a,b)=>a.age-b.age)但是我搞不清楚如何来判断是......
  • java计算机毕业设计二次元信息分享平台(附源码+springboot+开题+论文+部署)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着数字化时代的到来,二次元文化在全球范围内迅速崛起,成为年轻一代热衷的亚文化现象。二次元内容涵盖动漫、游戏、小说等多个领域,吸引了庞大的粉丝群......
  • java计算机毕业设计二手车平台交易系统(附源码+springboot+开题+论文+部署)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着经济的不断发展与人们生活水平的提高,汽车已成为人们日常生活中不可或缺的交通工具。然而,二手车市场的快速发展也带来了一系列问题,如信息不对称、......
  • 结合 tensorflow.js 、opencv.js 与 Ant Design 创建美观且高性能的人脸动捕组件并发
    系列文章目录如何在前端项目中使用opencv.js|opencv.js入门如何使用tensorflow.js实现面部特征点检测tensorflow.js如何从public路径加载人脸特征点检测模型tensorflow.js如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图tensorflow.js使用opencv.js将人......
  • 【深入理解Java IO流0x07】搞懂Java中的三种IO模型的区别:BIO & NIO & AIO
    1.引言NIO这一块是面试时比较喜欢问的问题,所以我们需要仔细学习。但是在直接讲NIO之前,需要大家对Java的IO模型首先有一个整体的认识,这样才方面后续我们深入探究NIO。我们接下来就开始吧!2.IO何为IO?I/O(Input/Outpu)即输入/输出。我们先从计算机结构的角度来解读一下......
  • JAVA 反射
    JAVA反射目录JAVA反射什么是JAVA反射类的加载过程Class详解参考博客什么是JAVA反射就是在运行时候可以动态的获取成员变量,方法。动态调用该类的方法。被称之为JAVA反射要使用该类的反射,必须获取到该类的字节码对象.解剖该类就要使用到Class类中的方法。所以先要获取到每一......