03 2023 档案
摘要:一、读写锁 ReentrantReadWriteLock 读写锁锁的一个资源能够被多个线程访问,或者被一个写线程访问,但是不能同时存在读写操作。读写操作时互斥的。 锁降级 锁降级就是将写入锁降级为读锁,是为了让当前线程感知到数据的变化,从而保证数据的可见性。 如果同一个线程持有了写锁,在没有释放写锁
阅读全文
摘要:我们要知道AQS是JUC的基石 我们用ReentrantLock来举例 当线程进来后,直接利用CAS尝试抢占锁,如果抢占成功,则state被改成1,且设置对象独占锁线程为当前线程 protected final boolean compareAndSetState(int expect, int u
阅读全文
摘要:一、三种GC算法 标记清楚(Mark-Sweep) 拷贝(Copying) 标记压缩(Mark-Compact) 二、基础GC回收 1.第一代Serial与SerialOld 单线程,会有严重的STW(stop the world) 用的是Copying Old用的是Mark-Sweep/Compa
阅读全文
摘要:一、逃逸分析 当一个对象在方法中被定义后,它有两种可能 被外部方法所引用:作为调用参数传递给其他方法,称为方法逃逸 被外部线程所引用:赋值给可以在其他线程中访问的实例变量,称为线程逃逸 如果能证明一个对象不会逃逸到方法或线程外,或者逃逸程度较低,则可以采取不同程度的优化 二、栈上分配 如果确定一个对
阅读全文
摘要:一、什么是循环依赖、一级缓存 A、B两个Service相互依赖,类似于死锁,我们来看AServiceBean的生命周期 我们要填充bService时,在单例池找不到B,就会先去创建B。但是创建B的时候,触发B的Bean的生命周期,在单例池也找不到A,产生循环依赖。 那么怎么处理呢,就需要打破依赖 s
阅读全文
摘要:一、rabbitmq的目的 rabbitmq主要有三个目的: 1.流量削峰 优点是:使用消息队列做缓冲 2.应用解耦 订单系统只要发送命令等待mq回复就行,不用等待三个系统的命令返回再回去回复给客户 3.异步处理 二、rabbitmq四大核心概念 生产者 交换机 队列 消费者 三、rabbitmq六
阅读全文
摘要:缓存穿透 概念:请求数据库访问时,假如发送的请求传进来的key是不存在Redis中的,那么就查不到缓存,查不到缓存就会去数据库查询。 怎么发生: 服务器被攻击 误删热点key 怎么解决: 把无效的Key存进Redis中。如果Redis查不到数据,数据库也查不到,我们把这个Key值保存进Redis,设
阅读全文
摘要:Redis内存满了怎么办? Redis的内存到达maxmemory了之后会开启内存淘汰策略 一个键是过期的,那么它到了过期时间之后是马上从内存中被删除呢? 不是,而是指定时间扫描一次,以减轻cpu的压力() 两种淘汰策略: LRU:最近最少使用页面置换算法,淘汰最长时间未被使用的页面 在热点key一
阅读全文
摘要:双写一致性时为了保证Redis缓存与MySQL数据库中的数据一样 我们对Redis中没有的数据,MySQL怎么回写呢? 我们用 双检加锁策略 这样只要第一个请求发过来,后面的请求就不会发送到MySQL,直接从Redis中获取缓存数据就可以了。 为了保证这种一致性,有三种方案 1. 先更新数据库,再更
阅读全文
摘要:首先,我们提出一个问题,Redis做缓存性能这么好,如果挂了怎么办? 因此,我们提出来的第一个解决方案就是主从复制原则 一、主从复制 什么是主从复制:是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master/Leader),后者称为从节点(Slave/Follow
阅读全文
摘要:一、Redis概述 Redis是一个高性能的NOSQL系列的非关系型,Redis是C语言编写的,基于内存(与MySQL基于硬盘不同,所以用作缓存) 所以Redis为什么这么快? 命令时基于内存 命令是单线程,没有上下文切换 基于IO多路复用机制 全局哈希表 二、常用五大数据类型 String、Has
阅读全文
摘要:1.ThreadLocal是什么 ThreadLocal本地线程变量,线程自带的变量副本(实现了每一个线程副本都有一个专属的本地变量,主要解决的就是让每一个线程绑定自己的值,自己用自己的,不跟别人争抢。通过使用get()和set()方法,获取默认值或将其值更改为当前线程所存的副本的值从而避免了线程安
阅读全文
摘要:一、对象的内存布局 在HotSpot虚拟机中,对象在堆内存中的存储结构可以分为三个部分,对象头、实例数据和对齐填充 1.对象头 对象头分为 对象标记(Mark Word)和类元信息(类型指针) 对象头里存放着:哈希码、GC标记、GC次数、同步锁标记、偏向锁持有者的信息 那么对象头里怎么存放数据呢 那
阅读全文
摘要:一、JMM 我们知道Java是一个跨平台的语言,那么Java是如何屏蔽掉各种操作系统、各种机器对内存访问的差异呢? 在JVM规范中,Java定义了一种内存模型,用来屏蔽掉各种硬件和操作系统的内存访问差异 1.JMM中的三大特性 可见性 当一个线程修改了某一个共享变量的值,其他线程能够立即知道该值变更
阅读全文
摘要:一、相关概念 1.什么是乐观锁、悲观锁 乐观锁是认为自己在使用数据的时候,没有其它线程会进行更改操作,因此不会添加锁,而是以来版本号或CAS自旋进行数据的校验。 悲观锁是认为自己在使用数据时,总有其它线程进行更改操作,因此一定会添加锁 2.什么是公平锁、非公平锁 公平锁是按照线程申请顺序来获取锁,L
阅读全文
摘要:一、Future 我们说到于实现多线程编程的接口,有几种想法 实现Runnable接口 实现Callable接口 实现Future接口和FutureTask实现类 如果我们要求多线程、有返回值、并且可以异步操作,怎么实现呢 那么我们分别来看三个接口的特点 1.Runnable接口、Callable接
阅读全文
摘要:一、List 1.ArrayList 底层是数组实现,线程不安全 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
阅读全文

浙公网安备 33010602011771号