学习记录----高并发

简介: 学习记录----高并发

问题:什么是CAS,CAS的原理是什么?

         什么是CAS的ABA问题?怎么解决?

         synchronized地锁升级过程是怎么样的?

         ReentrantLock底层的加锁和解锁是怎么实现的?

         为什么说ReentrantLock是默认非公平锁?

         什么是公平锁什么是非公平锁什么是可重入锁?


什么是CAS,CAS的原理是什么


cas叫自旋锁是线程锁的一种状态,cas的实现是这样的过程,当多个线程在争抢一个锁的时候,某一个线程获取到了这个锁,其他线程就在自旋等待,隔一会就来看一下这个锁是否轮到我了。一个经典的比喻在马士兵课上马老师说过,我是厕所所长的比喻。下面是Unsafe的源码,看并发这块的源码必读Unsafe源码,我是从SynchronousQueue类点进去看的

image.png

然后我看到了这样一段代码

UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);

compareAndSwapObject:比较并且交换当前对象。


貌似JDK1.8之前这块的代码叫做compareAndSet。


意思就是比较这个值和我期望的值是不是一样的,不是的话那我在去自旋等待。如果是哪我就去修改当前值变成我当前线程期望的那个值然后这个锁就是当前线程的。锁修改值的时候是原子性的。cas的底层hospot源码的最后一条指令叫做 lock cmpxchg hospot是c++写的,c++指定操作的是系统的CPU。属于CPU原语级别的指令。


但是cas会有一个非常著名的ABA问题,这个问题是这样的:假如现在一个线程 “张三” 在自旋等待他的线程期望值为2,当前这个锁的值为3有一个线程在使用这个锁,“张三”来了看到这个锁不是我的期望值,那么拿到当前这个锁上的值变成自己的期望值继续等待,当他做这个操作的时候,来了两个线程 A,B。这个时候这个锁被上一个人用完,A抢占了这个锁,然后一通操作结束让出这个锁了,锁上的值为4。这个时候“张三”还在做自己的操作,B线程也做了一通操做走了。把当前锁上的值改为了3。当“张三”线程再来的时候发现和我期望值一样,好现在这个锁归我了。这个就是ABA问题,这里有个很牛的比喻叫做,“你知道你前女朋友和你隔了一年复合她经历了多少个男人


这个ABA问题最好的解决办法是加版本号。每次修改记录一下版本号。

image.png

synchronized地锁升级过程是怎么样的


synchronized的锁升级过程其实就是面试中常问的四种锁状态。

  1. 无锁
  2. 偏向锁
  3. 轻量级锁
  4. 重量级锁


锁是怎么升级的:一开始在创建的new对象就是无锁的状态,当第一个线程过来的时候这个时候只有这一个线程,当前锁的状态为偏向锁。当好几个线程过来发生锁竞争了这个时候升级为轻量级锁(CAS自旋锁)。当线程越来越多,都在自旋这个时候非常消耗CPU资源,这个时候升级为重量级锁,所有的等待线程进入线程队列等待cpu的调度。


ReentrantLock底层的加锁和解锁是怎么实现的

ReentrantLock底层是AQS然后aqs里面有一个共享的int类型的值state这个值被voaltile修饰,ReentrantLock每次加锁state这个值就+1每次解锁这个值就-1


为什么说ReentrantLock是默认非公平锁

因为AQS底层有一个双向链表队列,新来的线程可以直接去抢锁。当没抢到的时候就进队列。


什么是公平锁什么是非公平锁什么是可重入锁


公平锁:线程先检查队列里面有没有,如果有就先等着排队,没有的话就直接执行

非公平锁:直接执行不检查队列

可重入锁:可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。

相关文章
|
关系型数据库 分布式数据库 数据库
沉浸式学习PostgreSQL|PolarDB 2: 电商高并发秒杀业务、跨境电商高并发队列消费业务
业务场景介绍: 高并发秒杀业务 秒杀业务在电商中最为常见, 可以抽象成热点记录(行)的高并发更新. 而通常在数据库中最细粒度的锁是行锁, 所以热门商品将会被大量会话涌入, 出现锁等待, 甚至把数据库的会话占满, 导致其他请求无法获得连接产生业务故障. 业务场景介绍: 高并发队列消费业务 在跨境电商业务中可能涉及这样的场景, 由于有上下游产业链的存在, 1、用户下单后, 上下游厂商会在自己系统中生成一笔订单记录并反馈给对方, 2、在收到反馈订单后, 本地会先缓存反馈的订单记录队列, 3、然后后台再从缓存取出订单并进行处理.
425 1
|
存储 安全 Linux
【项目设计】高并发内存池—tcmalloc核心框架学习(三)
【项目设计】高并发内存池—tcmalloc核心框架学习
217 1
|
存储 缓存 算法
【项目设计】高并发内存池—tcmalloc核心框架学习(二)
【项目设计】高并发内存池—tcmalloc核心框架学习
209 1
|
存储 缓存 Java
【项目设计】高并发内存池—tcmalloc核心框架学习(一)
【项目设计】高并发内存池—tcmalloc核心框架学习
497 1
|
小程序 Java 容器
“马士兵老师”纯手写2022版多线程与高并发PDF学习手册
这份2022版多线程与高并发的学习手册,是基于同学们2022上半年面试遇到的问题呀以及当下最流行的技术进行的更新升级的版本讲解,从最基础的线程、纤程、协程等等开始讲起,其中还有高并发调优的经验讲解,从基础到精通一站式为大家解决完。
|
Java
多线程与高并发学习:ThreadPoolExecutor源码解析
多线程与高并发学习:ThreadPoolExecutor源码解析
85 0
|
存储 缓存 Java
多线程与高并发学习:ThreadLocal源码详解
多线程与高并发学习:ThreadLocal源码详解
74 0
|
安全 Java 容器
多线程学习时常出现的问题(一)高并发下的ArrayList和并发下诡异的HasMap
多线程学习时常出现的问题(一)高并发下的ArrayList和并发下诡异的HasMap
214 0
|
存储 缓存 并行计算
Java 并发与高并发知识学习
  一、并发与高并发基本概念   并发:   从业务上简单解释就是多个用户(编码层面就是多个线程)共同竞争(修改或读取)一个资源,并发问题更多体现在业务代码操作数据上,例如:秒杀场景,瞬间会有大量用户共同抢购一个商品,这时候如果没有并发控制,则极有可能出现超卖情况,即库存被扣成了负数。   从操作系统以及硬件层面解释并发:有多个线程运行在CPU上,当在单核处理上运行的时候,多个线程在单核处理上交替执行(伪并行),不断的从内存中换入换出,在多核处理器上每个线程会被分配到某一个内核上运行(并行),我觉得更适合叫并行计算。
88 0
|
程序员
【高并发】学习高并发我们究竟要不要读源码?别纠结,肝就完了!
最近正在写【高并发专题】的文章,其中,在【高并发专题】中,有不少是分析源码的文章,很多读者留言说阅读源码比较枯燥!问我程序员会使用框架了,会进行CRUD了,是否真的有必要阅读框架源码?!
129 0

热门文章

最新文章

  • 1
    高并发场景下,到底先更新缓存还是先更新数据库?
    66
  • 2
    Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
    74
  • 3
    Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
    68
  • 4
    Java面试题:如何实现一个线程安全的单例模式,并确保其在高并发环境下的内存管理效率?如何使用CyclicBarrier来实现一个多阶段的数据处理任务,确保所有阶段的数据一致性?
    62
  • 5
    Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
    55
  • 6
    Java面试题:假设你正在开发一个Java后端服务,该服务需要处理高并发的用户请求,并且对内存使用效率有严格的要求,在多线程环境下,如何确保共享资源的线程安全?
    69
  • 7
    在Java中实现高并发的数据访问控制
    42
  • 8
    使用Java构建一个高并发的网络服务
    29
  • 9
    微服务06----Eureka注册中心,微服务的两大服务,订单服务和用户服务,订单服务需要远程调用我们的用,户服务,消费者,如果环境改变,硬编码问题就会随之产生,为了应对高并发,我们可能会部署成一个集
    37
  • 10
    如何设计一个秒杀系统,(高并发高可用分布式集群)
    129