自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 目录第一版

->缓存击穿/缓存雪崩-->布隆过滤器。2-->volatile-->synchronize-->synchronize锁膨胀。4-->HashMap-->concurrentHashMap-->cas自旋。-->线程池合理应用。5-->redis内存实现-->redis主从复制原理。-->序列化/反序列化。

2023-03-26 16:05:48 49

转载 synchronize锁膨胀机制

偏向锁,何为偏向,是指该实例将会偏向第一个来获取它的锁的线程,如果没有其它线程来请求获取锁,则持有该锁的线程永远不需要同步。重量级锁,即前文提到的Monitor,其本质是依赖于系统底层的Mutex Lock,也是性能开销最大的状态。在jdk6之后,synchronized得到了一次性能优化,这次性能优化,就是锁膨胀。锁膨胀用一句话简单概括就是,一个锁经过三次膨胀变的笨重的但稳重过程。对象头中的Mark word区域,存储着对象的哈希值,GC年龄,换句话讲,每一个对象,都有四种锁的状态。

2023-03-26 16:18:09 120

原创 缓存穿透,缓存击穿,缓存雪崩

比如,在初始化缓存的时候,给这些数据的过期时间增加一个较小的随机数,这样一来不同数据的过期时间有所差别又差别不大,即避免了大量数据同时过期又能保证这些数据在相近的时间失效。初始化缓存数据的时候设置缓存永不过期,然后启动一个后台线程 30 秒一次定时把所有数据更新到缓存,而且通过适当的休眠,控制从数据库更新数据的频率,降低数据库压力。缓存击穿是指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到db,属于常见的“热点”问题。方案一 差异化设置过期时间。

2023-03-26 16:08:10 98

转载 ConcurrentHashMap和hashTable原理

如果检测到 ConcurrentHashMap 正在进行扩容操作,也就是当前桶位置上被插入了 ForwardingNode 节点,那么当前线程也要协助进行扩容,协助扩容时会调用 helpTransfer() 方法,当方法被调用的时候,当前 ConcurrentHashMap 一定已经有了 nextTable 对象,首先拿到这个 nextTable 对象,调用transfer方法。作为一个转发的作用,扩容期间如果遇到查询操作,遇到转发节点,会把该查询操作转发到新的数组上去,不会阻塞查询操作。

2023-03-26 16:07:34 123

转载 ThreadPoolExecutor类讲解

当调用 cancel 时,如果调用成功,而此任务尚未启动,则此任务将永不运行。invokeAny(collection of tasks)/invokeAny(collection of tasks, long timeout, TimeUnit unit):阻塞的方法,不会返回 Future 对象,而是返回集合中某一个Callable 对象的结果,而且无法保证调用之后返回的结果是哪一个 Callable,如果一个任务运行完毕或者抛出异常,方法会取消其它的 Callable 的执行。同样,也带有超时功能;

2023-03-26 16:06:34 299

原创 线程池合理应用

(1)核心线程数:核心线程数量,线程池中会存在这么多个线程,当线程数量(包含空闲线程)少于corePoolSize的时候,会优先创建新线程,可以设置allowCoreThreadTimeOut=true来让核心线程池中线程也移除。对于 CPU 密集型,多线程本质上是为了提升多核 CPU 的利用率,所以对于一个 4 核的 CPU,每个核一个线程,理论上创建 4 个线程就可以了,再多创建线程也只是增加线程切换的成本。(3)空闲线程存活时间:空闲线程存活时间,线程空闲超过这个时间的时候就会销毁。

2023-03-26 16:06:13 70

转载 分布式锁的3种实现方式

目前主流的有三种,从实现的复杂度上来看,从上往下难度依次增加:基于数据库实现基于Redis实现基于ZooKeeper实现无论哪种方式,其实都不完美,依旧要根据咱们业务的实际场景来选择。

2023-03-26 16:05:42 55

转载 Redis主从复制原理总结

和Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。下图为级联结构。Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:- 从服务器连接主服务器,发送SYNC命令;

2023-03-26 16:05:32 119

原创 forkJoin框架

fork/join 框架是 Java 7 中引入的 ,它是一个工具,通过 「 分而治之 」 的方法尝试将所有可用的处理器内核使用起来帮助加速并行处理。在实际使用过程中,这种 「 分而治之 」的方法意味着框架首先要fork,递归地将任务分解为较小的独立子任务,直到它们足够简单以便异步执行。然后,join部分开始工作,将所有子任务的结果递归地连接成单个结果,或者在返回 void 的任务的情况下,程序只是等待每个子任务执行完毕。为了提供有效的并行执行,fork/join 框架使用了一个名为的线程池,用于管理。

2023-03-26 16:05:02 53

原创 跨域问题CORS

Access-Control-Allow-Methods 表示服务器允许客户端使用 PUT、DELETE 方法发起请求,可以一次设置多个,表示服务器所支持的所有跨域方法,而不单是当前请求那个方法,这样好处是为了避免多次预检请求。具体实现方法是:在响应头Access-Control-Allow-Origin字段中设置指定的域名,表示允许这些域名的跨域请求。Access-Control-Allow-Origin 表示哪些请求源是可以访问的,该字段也可以设置为 “*” 表示允许任意跨源请求。

2023-03-26 16:04:51 168

转载 SpringBoot整合RabbitMQ

使用@RabbitListener标记在类上(重载区分不同的消息),说明这个类就是用来接受消息队列的方法类,在该类下的所以方法上标记@RabbitHandler,每个方法指定不同的接收参数,这样就可以接收不同类型的消息。Queue队列:可以很多人都来监听。只要收到消息,队列删除消息,并且只能同时用且只有一个人接收到此消息。保证每个消息被正确消费,此时才可以MQ删除这个消息。可靠抵达-消费端确认(ack)由监听的消息类型可以看出为。类型,因此可以改造参数类型。配置文件rabbitMQ。

2023-03-25 17:14:18 93

转载 SpringBoot 整合ActiveMQ

扩展点补充:如果想额外添加topic消费者,如果MQ服务端消息没有被消费完毕,新增topic消费者可以消费以前未被消费的消息,消息存储规则:所有消费者消费成功,MQ服务端消息删除,有一个消息没有没有消费完成,消息也会存储在MQ服务端。TOPIC订阅模式: 消息属于广播(订阅)模式,消息会被所有的topic消费者消费消息。已经处于运行topic消费者5个,5个消费者消费完成后,MQ服务端消息删除。消息存储规则:消费者消费消息成功,MQ服务端消息删除。特点:消息遵循先到先得,消息只能被一个消费者消费。

2023-03-25 17:09:43 740

转载 HashMap底层实现原理概述

HashMap内部的bucket数组长度为什么一直都是2的整数次幂答:这样做有两个好处,第一,可以通过(table.length - 1) & key.hash()这样的位运算快速寻址,第二,在HashMap扩容的时候可以保证同一个桶中的元素均匀地散列到新的桶中,具体一点就是同一个桶中的元素在扩容后一般留在原先的桶中,一般放到了新的桶中。HashMap默认的bucket数组是多大答:默认是16,即时指定的大小不是2的整数次幂,HashMap也会找到一个最近的2的整数次幂来初始化桶数组。

2023-03-25 11:59:32 241

转载 ThreadLocal 详解

2、如果获取的Map不为空,则将参数设置到Map中(当前ThreadLocal的引用作为key)如果Map为空,则给该线程创建 Map,并设置初始值。1、首先获取当前线程,并根据当前线程获取一个Map/2、如果获取的Map不为空,则移除当前ThreadLocal对象对应的entry。4、Thread内部的Map是由ThreadLocal维护的,由ThreadLocal负责向map获取和设置线程的变量值。5、对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,形成了副本的隔离,互不干扰。

2023-03-25 11:49:42 48

转载 synchronized和ReentrantLock的比较

1.区别:1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;4)通过L

2023-03-25 11:17:44 491

转载 volatile 和 synchronized 的区别

内存屏障指令保证了所有 CPU 操作结果都会直接刷到主存中,从而保证了操作的内存可见性,同时也使得先获得这个锁的线程的所有操作,都。变量的读写都会直接刷到主存,即保证了变量的可见性。的实现,线程在具体执行时,会先拷贝主存数据到线程本地(CPU 缓存),操作完成后再把结果从线程本地刷到主存。关键字解决的是执行控制的问题,它会阻止其它线程获取当前对象的监控锁,这样就使得当前对象中被。控制的是线程执行结果在内存中对其它线程的可见性。关键字解决的是内存可见性的问题,会使得所有对。于随后获得这个锁的线程的操作。

2023-03-25 11:17:14 59

转载 ReentrantLock锁

1.Lock接口Lock,锁对象。在Java中锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但有的锁可以允许多个线程并发访问共享资源,比如读写锁,后面我们会分析)。

2023-03-25 11:14:04 45

转载 synchronized原理

任意一个对象都拥有自己的监视器,当同步代码块或同步方法时,执行方法的线程必须先获得该对象的监视器才能进入同步块或同步方法,没有获取到监视器的线程将会被阻塞,并进入同步队列,状态变为BLOCKED。达到同步效果,但如果不同线程同时对该类的不同对象执行这个同步方法时,则线程之间不会形成互斥,因为他们拥有的是不同的锁。当线程试图访问同步代码时,必须先获得对象锁,退出或抛出异常时必须释放锁。锁住的是该类,当所有该类的对象(多个对象)在不同线程中调用这个static同步方法时,线程之间会形成互斥,达到同步效果。

2023-03-25 11:11:12 69

转载 java内存垃圾回收机制GC

垃圾收集 Garbage。

2023-03-25 11:04:01 2442

转载 JMM内存模型

即Java Memory Model,简称。JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。如果我们要想深入了解,就要先理解好Java内存模型。Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。原始的Java内存模型效率并不是很理想,因此Java1.5版本对其进行了重构,现在的Java8仍沿用了Java1.5的版本。

2023-03-25 11:03:35 86 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除