首页 > 编程语言 >高级java高并发,高性能,分布式,高可用,负载均衡,系统架构实战

高级java高并发,高性能,分布式,高可用,负载均衡,系统架构实战

时间:2023-07-16 21:22:22浏览次数:52  
标签:负载 加锁 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加一个锁,伪代码如下:

 

 



标签:负载,加锁,java,String,用户,并发,场景,字符串,分布式
From: https://www.cnblogs.com/aiw1024/p/17558593.html

相关文章

  • Java语言的特性
    面向对象:Java是一种纯面向对象的编程语言,这意味着Java中所有的代码都是以对象为基础的。在Java中,你可以通过定义类来创建对象,这些对象可以具有状态(属性)和行为(方法)。Java支持继承、多态和封装等面向对象的概念,使代码更加清晰、易于扩展和维护。平台无关性:Java的平台无关性......
  • Java python C++
    Java和Python的区别编程范式:Java是一种面向对象的编程语言,而Python支持多种编程范式,包括面向对象、函数式和命令式等。这意味着Python在某些情况下可以比Java更简洁、易于理解和编写。代码可读性:Python是一种非常易于阅读和编写的编程语言,其语法和代码风格非常清晰......
  • 每日汇报 第四周第一天 JAVA中的I/O流
    今日所学:明确输入、输出的方向;明确字节流和字符流在操作流的数据单元方面上的异同;掌握Inputstream类、Reader类、OutputStream类和Writer类的常用方法;熟练掌握使用File类的3种构造方法创建文件对象明日计划:继续进行I/O流的学习,考科三遇到困难:练车真坐牢......
  • Java方法
    0x01认识方法1、什么是方法方法是一种语法结构,它可以把一段代码封装成一个功能2、为什么要用方法以方便重复调用。方法提高了代码的复用性,让程序的逻辑更清晰。0x02方法的使用1、方法的定义及其调用修饰符返回值类型方法名(形参列表){ 法体代码(需要执行的功能代......
  • 学习java第4天
    HelloWorld随便新建一个文件夹,存放代码新建一个java文件-文件后缀名为.java-Hello.java-[注意点]系统可能没有显示文件后缀名,我们需要手动打开编写代码publicclassHello{publicstaticvoidmain(String[]args){System.out.print("Hello,......
  • Java流程控制
    Java流程控制用户交互Scanner通过Scanner类来获取用户的输入基本语法:Scanners=newScanner(System.in);通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据next():一定要读取到有效字......
  • spire 的nested exception is java.lang.NoSuchMethodError
    解决"spire的nestedexceptionisjava.lang.NoSuchMethodError"的步骤概述在解决"spire的nestedexceptionisjava.lang.NoSuchMethodError"这个问题之前,我们首先需要了解什么是NoSuchMethodError错误。NoSuchMethodError错误表示在运行时找不到所需的方法。这通常是......
  • required a bean of type 'java.util.concurrent.ConcurrentHashMap' that could
    如何解决"requiredabeanoftype'java.util.concurrent.ConcurrentHashMap'thatcould"错误问题概述在开发过程中,有时我们会遇到SpringBoot应用程序启动时出现"requiredabeanoftype'java.util.concurrent.ConcurrentHashMap'thatcould"错误的问题。这个错......
  • Docker部署Java应用[转]
    练习要求:在CentOSLinuxrelease7.7.1908(Core)中,先拉一个Centos镜像,然后在光秃秃的centos镜像基础上把项目环境搭建好,然后再提交到自己的docker仓库里。 操作环境:虚拟机中安装好的CentOSLinuxrelease7.7.1908(Core) 一、安装并启动Docker 1.更新yumyum-yu......
  • Java-多线程-八股文
    线程安全的理解?线程安全说的是,当多个线程并发访问互斥资源时,读写互斥资源的代码逻辑能正常处理,获得正确结果,不会互相干扰的情况。守护线程的理解?守护线程是与普通线程相区分的概念,用户一般使用的就是普通线程,普通线程有自身独立的生命周期,而守护线程的生命周期取决于普通......