JAVA高并发的三种实现

提到锁,大家肯定想到的是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加一个锁,伪代码如下:

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程同步(multiprocess.Lock、multiprocess.Semaphore、multiprocess.Event) day38

进程同步(multiprocess.Lock、multiprocess.Semaphore、multiprocess.Event) 锁 —— multiprocess.Lock 通过刚刚的学习,我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,他们之间的运行没有顺序,一旦开启…

Python杨辉三角

杨辉三角,是二项式系数在三角形中的一种几何排列,在中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡…

PHP 数据库连接池实现(转)

转自https://blog.csdn.net/Marksinoberg/article/details/53857511 摘要xml 读取配置文件 简易方式常规方式PHP解析XML 配置文件解析数据库连接池测试 申请过多时拒绝请求已满后拒绝放入总结此文着实无聊,不要浪费时间往下看啦 摘要 之前总是以脚本面向过程的方式…

批量处理JDBC语句提高处理速度

当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率JDBC的批量处理语句包括下面两个方法:– addBatch(String):添加需要批量处理的SQL语句或…

TCP close_wait内幕

最近调试时遇到一个tcp连接 一发交易server端就从es连接状态变成close_wait状态的问题。 tcp连接需要三次握手,而被动关闭连接则是需要四次握手的,不能说单方面关闭连接就是成功关闭连接了。 首先我们要搞清楚close_wait出现的机制和原理。 close_wai…

p-value

p-value p-value翻译为假定值,假设几率。我们在生物信息中通常使用p值方法(P-Value, Probability, Pr)来做检验。那么p-value是什么呢?其实P-value就是一种概率,表示在原假设为真的前提下出现观察样本以及更极端情况的…

面向对象初调用:foolish 电梯

本周我们完成的任务是傻瓜电梯的调度,对于那十分十分详细的指导书,我感觉想要说明白题目要求,是做不到的,所以就把指导书贴出来给大家看了,,由于在下还不会网页制作,只能通过百度网盘了&#xf…

Maven学习之(一)基本配置

安装maven还几次没成功,不过最后还是查资料成功了,所以记录一下。 1.安装JDK,比较简单,就不说明了。 2.配置java的环境变量 JAVA_HOME (最开始因为java配置成C:\Program Files (x86)\Java\jdk1.8.0_144\bin 所以出问题…

浅学习使用Ribbon 和 Feign的理解和使用

Ribbon是Netflix公司开源的一个负载均衡的项目,是一个基于 HTTP、TCP的客户端负载均衡器. 什么是负载均衡? 负载均衡是微服务架构中必须使用的技术,通过负载均衡来实现系统的高可用、集群扩容等功能。负载均衡可通过 硬件设备及软件来实现,硬件比如&am…

OSI七层协议模型

OSI七层协议模型 1. OSI七层和TCP/IP四层的关系 OSI引入了服务、接口、协议、分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型。OSI先有模型,后有协议,先有标准,后进行实践;而TCP/IP则相反,先有协议和…

Centos启动卡住,starting auditd: [failed]

具体原因可能是什么权限导致的吧 &#xff0c;母鸡啊 解决方式&#xff1a; 在重启客户端时输入 i 然后输入 a &#xff0c;在<_root KEYBOARDTYPEpc KEYTABLEus rd_NO_DM后空格输入 single再 enter就进入了

FPGA中计数器设计探索

FPGA中计数器设计探索&#xff0c;以计数器为32位为例&#xff1a; 第一种方式&#xff0c;直接定义32位计数器。 reg [31:0]count; quartus ii 下的编译&#xff0c;资源消耗情况。 85C模型下的时钟频率。 0C模型下的时钟频率。 chip planner下资源分布情况。 第二种方式&…

MongoDB服务无法注册

按此步骤执行出现无法注册服务名问题时&#xff0c;如下解决&#xff1a; 方法一&#xff1a; 方法二&#xff1a; 如果还是无法解决的话&#xff0c;首先卸载MongoDB&#xff0c;然后清MongoDB注册表&#xff0c;重新安装&#xff0c;然后按一开始那样执行mongo.conf文件&am…

006 list类型

一.概述 在redis之中,我们需要把list视为一个链表,存储的元素我们需要视为一个字符串(可以是序列化的字符串). list的核心就是 : 有序的字符串列表. 二 .基本操作 [1]lpush , rpush 从左方向和右方向追加元素 [2] 查询指定范围的数据 --- lrange index last_indezx [3] 获取指…

SpringBoot学习笔记(8):事物处理

SpringBoot学习笔记&#xff08;8&#xff09;&#xff1a;事物处理 快速入门 在传统的JDBC事务代码开发过程中&#xff0c;业务代码只有一部分&#xff0c;大部分都是与JDBC有关的功能代码&#xff0c;比如数据库的获取与关闭以及事务的提交与回滚、大量的try..catch..finally…

如何计算并测量ABAP及Java代码的环复杂度Cyclomatic complexity

代码的环复杂度(Cyclomatic complexity&#xff0c;有的地方又翻译成圈复杂度)是一种代码复杂度的衡量标准&#xff0c;在1976年由Thomas J. McCabe, Sr. 提出。 在软件测试的概念里&#xff0c;圈复杂度用来衡量一个模块判定结构的复杂程度&#xff0c;数量上表现为独立线性路…

ZuulFilter的使用场景

各个微服务的访问需要网关统一管理进行跳转&#xff0c;而在访问网关时&#xff0c;我们可以进行增强功能&#xff0c;通过过虑器实现请求过虑&#xff0c;身份校验 等。 /*** 身份校验过滤器*/ Component public class LoginFilter extends ZuulFilter {AutowiredAuthServic…

机器学习实战 k-近邻算法 手写识别系统

转载于:https://www.cnblogs.com/crysa/p/8735556.html

Fegin拦截器解决各微服务之间数据下沉

上篇说了当前端访问微服务网关&#xff0c;借助ZuulFilter过滤器来过滤所有请求&#xff0c;获取request&#xff0c;判断cookie是否有身份短令牌&#xff0c;request的header中是否有Jwt令牌&#xff0c;redis中是否有Jwt令牌。但是这个数据传递只能是前端访问微服务时&#x…

免杀原理与实践

杀软原理 目前杀毒软件的原理主要有3种&#xff1a; 1.引擎与病毒库的交互作用&#xff0c;通过特征码提取与病毒库中的特征码进行比对识别病毒。 2.启发式Heuristic&#xff0c;通过程序的一些行为和特征来判断。 3.在虚拟机技术上的启发式&#xff0c;通过建立一个虚拟环境运…