Volatile原理
发表于|Java
|总字数:3|阅读时长:1分钟
Volatile原理



文章作者: 彬子
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 彬子的Blog!
相关推荐

2025-11-28
ConcurrentHashMap底层原理
ConcurrentHashMap底层原理 jdk1.7是数组加链表,它在对象中保存了一个Segment数组。每个Segment元素类似于一个Hashtable;这样,在执行put操作时首先根据hash算法定位到元素属于哪个Segment,然后对该Segment加锁即可,不同的Segment可以并发put。而Segment的锁实现其实是ReentrantLock jdk1.8则是采用了数组+链表/红黑树,他舍弃了Segment数组,用的是CAS +...
2025-01-23
Synchronized 与 ReentrantLock 的区别
Synchronized 与 ReentrantLock 的区别 synchronized:隐式锁,JVM 自动加锁 / 释放锁 ReentrantLock:显式锁,需要手动 lock() / unlock() ReentrantLock 本质上是基于 AQS 实现的。 synchronized是非公平锁 然后ReentrantLock 有公平锁有非公平锁 ReentrantLock 支持中断lock.lockInterruptibly();还有超时获取锁 123if (lock.tryLock(1, TimeUnit.SECONDS)) { try { } finally { lock.unlock(); }} synchronized ReentrantLock 锁类型 隐式锁 显式锁 释放方式 自动 手动 公平锁 不支持 支持 可中断 不支持 支持 超时获取 不支持 支持 底层 JVM AQS ReentrantLock的使用场景 一般场景我优先使用...
2025-12-17
AIO BIO NIO区别?
AIO BIO NIO区别? BIO(同步阻塞 I/O) BIO 是传统的 I/O 模式,全称为 Block I/O,也叫同步阻塞 I/O。在 BIO 模式下,当我们执行 I/O 操作时,比如读取文件或者网络请求,程序会 阻塞,直到 I/O 操作完成后,才能继续执行后面的代码。也就是说,当一个线程在等待 I/O 完成时,它是处于阻塞状态的,不能做其他事情。 NIO(同步非阻塞 I/O) 一个线程管理多个连接 NIO 是对传统 BIO 的改进,它全称是 Non-blocking I/O(非阻塞 I/O)。在 NIO 模式下,I/O 操作不是阻塞的,可以同时处理多个 I/O 请求。与 BIO 不同的是,NIO 使用了 Channel(通道) 和 Buffer(缓冲区) 来进行数据读写,并且它支持 多路复用,这意味着多个 I/O 操作可以共享一个线程来处理,从而大大提高了并发性能。 AIO(异步非阻塞 I/O) AIO 是 NIO 的进一步升级,叫做 Asynchronous I/O(异步非阻塞 I/O)。在 AIO 模式下,I/O 操作是完全异步的,不需要线程阻塞等待...

2025-12-19
HotSpot 垃圾收集器
HotSpot 垃圾收集器 HotSpot 虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,虽然我们要对各个收集器进行比较,但并非为了挑选出一个最好的收集器。我们选择的只是对具体应用最合适的收集器。 新生代垃圾收集器 Serial 垃圾收集器(单线程) 只开启一条 GC 线程进行垃圾回收,并且在垃圾收集过程中停止一切用户线程,即 Stop The World。 一般客户端应用所需内存较小,不会创建太多对象,而且堆内存不大,因此垃圾收集器回收时间短,即使在这段时间停止一切用户线程,也不会感觉明显卡顿。因此 Serial 垃圾收集器适合客户端使用。 由于 Serial 收集器只使用一条 GC 线程,避免了线程切换的开销,从而简单高效。 ParNew 垃圾收集器(多线程) ParNew 是 Serial 的多线程版本。由多条 GC 线程并行地进行垃圾清理。但清理过程依然需要 Stop The World。 ParNew 追求“低停顿时间”,与 Serial 唯一区别就是使用了多线程进行垃圾收集,在多 CPU 环境下性能比 Serial...

2025-11-23
HashMap
HashMap JDK 7 中 HashMap 的数据结构是数组+链表。 JDK 8 中 HashMap 的数据结构是数组+链表+红黑树。 它在链表长度大于8且数组长度大于64时候会把链表转换成红黑树 HashMap 的初始容量是 16,随着元素的不断添加,HashMap 就需要进行扩容,阈值是capacity * loadFactor,capacity 为容量,loadFactor 为负载因子,默认为 0.75。 扩容后的数组大小是原来的 2 倍,然后把原来的元素重新计算哈希值,放到新的数组中。 负载因子(load factor)是一个介于 0 和 1 之间的数值,用于衡量哈希表的填充程度。它表示哈希表中已存储的元素数量与哈希表容量之间的比例。 负载因子过高(接近 1)会导致哈希冲突增加,影响查找、插入和删除操作的效率。 负载因子过低(接近 0)会浪费内存,因为哈希表中有大量未使用的空间。 HashMap 的put过程: 1.他会先对key计算扰动hash,通过key.hashCode() ^ (key.hashCode() >>>...

2025-12-28
类加载机制与类加载器
类加载机制/类加载器 类加载的完整流程(生命周期) 类从加载到卸载经历 5 个阶段,其中加载、验证、准备、初始化、卸载的顺序是固定的,解析阶段可能与初始化交叉进行: 1. 加载(Loading) 任务:通过类的全限定名(如com.example.User)获取其字节码数据,并生成Class对象。 来源:字节码可来自本地文件、网络、数据库、动态生成(如 CGLib)等。 关键组件:类加载器(ClassLoader)负责此阶段。 2. 验证(Verification) 任务:确保字节码符合 JVM 规范,避免恶意或无效字节码危害虚拟机安全。 验证内容 文件格式验证(魔数、版本号等) 元数据验证(类继承关系、字段方法合法性) 字节码验证(指令逻辑正确性) 符号引用验证(常量池引用有效性) 3. 准备(Preparation) 任务 :为类的静态变量分配内存并设置 初始默认值 (非显式赋值)。 例如:public static int a = 10;在准备阶段a的值为0(int...
公告
This is my Blog


