后端
文章平均质量分 88
leeleezl
这个作者很懒,什么都没留下…
展开
-
【Java 多线程】AQS 介绍
AQS 即 AbstractQuenedSynchronizer,抽象式队列同步器,是可以给我们实现锁的一个框架,内部实现关键是维护了一个先进先出的虚拟队列,以及 state 状态变量,队列存储的载体是 Node 节点,节点标识这当前的状态值,是独占锁还是共享锁以及它的前驱节点和后继节点简单来说,就是 AQS 定义了模板,具体实现由各个子类完成,子类无非就是实现对于共享资源state的获取和释放,至于具体线程等待队列的维护(如获取资源失败入队/唤醒出队等),AQS已经在上层已经帮我们实现好了。原创 2024-04-22 14:37:48 · 579 阅读 · 0 评论 -
【Java 多线程】Volatile 详解
为了让各个处理器的缓存是一致的,实现了缓存一致性协议(EMSI),每个处理器会在总线上嗅探自己的缓存是不是过期了,档处理器发现自己的缓存有过期的,则将自己对应的缓存行状态设置为无效,当处理器重新读取这个数据的时候,会从内存中重新读取。对一个 volatile 变量的赋值程序通过反编译可以看到,在 volatile 修饰的共享变量进行写操作的时候会多出 lock 前缀的指令。对于一个 volatile 变量的写操作,JVM 会向处理器发送一条 lock 指令,将这个变量所在的缓存行的数据写回内存中。原创 2024-04-22 14:36:15 · 249 阅读 · 0 评论 -
【Java 多线程】Synchronized
偏向锁状态下,线程要获取锁时,会在 MarkWord 中直接记录线程 ID,只要线程来执行代码了,会对比线程 ID 是否相等,相等直接获取锁,执行同步代码,不相等则尝试使用 CAS 修改 MarkWord 中的线程 ID ,如果修改成功则获取锁,修改不成功说明有竞争,因此会撤销偏向锁升级为轻量级锁。在内存中,对象一般由三部分组成,分别是对象头、实际数据和对齐填充,重点在与对象头,对象头中有一个我们比较关注的部分,MarkWord,MarkWord 中记录了有关锁的信息包括锁标记位,是否为偏向锁等。原创 2024-04-19 10:53:09 · 1024 阅读 · 0 评论 -
【Java】HashMap 源码阅读
HashMap 主要用来存放键值对,实现了基于哈希表的 Map 接口,非线程安全。HashMap 可以存放 null 的 key 和 null 值,但 null 作为 key 只能有一个,null 作为 value 可以有多个。HashMap 的默认大小为16,之后每次扩充,容量都变为原来的2倍,并且 HashMap 总是以2的幂作为哈希表的大小。原创 2024-04-10 15:00:14 · 756 阅读 · 1 评论 -
【Java】ArrayList 源码阅读
ArrayList 底层数据结构是可变大小的数组,继承自实现ListCloneable接口。原创 2024-04-10 14:55:16 · 354 阅读 · 1 评论 -
【I/O】基于事件驱动的 I/O 模型---Reactor
假设我们现在有一个服务器,想要对接多个客户端,那么最简单的方法就是服务端为每个连接都创建一个线程,处理完业务逻辑后,随着连接关闭线程也要销毁,但是这样线程创建和销毁,不仅会带来性能开销也会带来资源浪费,如果同时有几万个连接,创建几万个线程是不现实的。原创 2024-04-10 10:52:22 · 972 阅读 · 1 评论 -
【I/O】Unix IO 介绍
对于一个套接字上的输入操作,通常第一步是等待数据从网络中到达,当数据到达时,先将数据复制到内核缓冲区中,第二步就是将数据从内核缓冲区中复制到应用进程的缓冲区中。原创 2024-04-08 15:05:50 · 726 阅读 · 1 评论