- 博客(5)
- 收藏
- 关注
原创 Java对象内存布局和synchronized升级
引言:Object obj = new Object(); 理解?首先,这个对象肯定是存在jvm的堆内存的。然后谈谈它的堆内存中的布局。内存布局对象头、实例数据、对齐填充(保证8个字节的倍数)。对象头对象头又分为Mark Word和Class Pointer(类型指针),如果是数组对象,还有一个保存数组长度的空间Length。Mark Word默认存储对象的HashCode、分代年龄和锁标志位等信息。这些信息都是与对象自身定义无关的数据,所以MarkWord被设计成一个非固定的数据结构以便在极
2021-10-21 22:56:50
165
原创 原子操作类
基础类型原子类AtomicInteger,AtomicBoolean,AtomicLong。底层都是CAS,会出现ABA问题。常用API:API说明public final int get()获取当前的值public final int getAndSet(int newValue)获取当前的值,并设置新的值public final int getAndIncrement()获取当前的值,并自增public final int getAndDecrement
2021-10-16 23:42:43
137
原创 ThreadLocal
是什么ThreadLocal提供线程局部变量,如果创建一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题。ThreadLocal实例通常是类中的私有静态字段。ThreadLocal并不解决线程间共享数据的问题。\color{#FF0000}{ThreadLocal 并不解决线程间共享数据的问题。}ThreadLocal并不解决线程间共享数据的问题。使用场景ThreadLocal 适用于变量在线
2021-10-16 21:01:09
656
原创 volatile的使用
作用可见性有序性内存语义当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中,当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,直接从主内存中读取共享变量。所以volatile的写内存语义是直接刷新到主内存中,读的内存语义是直接从主内存中读取。底层实现内存屏障使用场景普通变量赋值可以,但是含复合运算的赋值不行(类似i++),也不能修饰引用类型,不能保证对象内部的属性可见性。volatile int a = 10; /
2021-10-11 21:12:04
317
原创 CAS(CompareAndSwap)
是什么 CAS的全称为Compare-And-Swap,它是一条CPU并发原语,中文翻译成比较并交换,实现并发算法时常用到的一种技术,它包含三个操作数——内存位置、预期原值及更新值。执行CAS操作的时候,将内存位置的值与预期原值比较:如果相匹配,那么处理器会自动将该位置值更新为新值,如果不匹配,处理器不做任何操作,多个线程同时执行CAS操作只有一个会成功,这个过程是原子的。 由于CAS是一种系统原语,原语属于操作系统用语范畴,是由若干条指令组成的,用于完成某个功能的一个过程,并且原语的执行必须是连
2021-09-28 23:31:41
211
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人