- 博客(15)
- 收藏
- 关注
原创 ReentrantReadWriteLock、StampedLock说明
1 代码中声明了一个volatile类型的cacheValid变量,保证其可见性。2 首先获取读锁,如果cache不可用,则释放读锁。获取写锁,在更改数据之前,再检查一次cacheValid的值,然后修改数据,将cacheValid置为true,然后在释放写锁前立刻抢夺获取读锁;此时,cache中数据可用,处理cache中数据,最后释放读锁。这个过程就是一个完整的锁降级的过程,目的是保证数据可见性。总结:一句话,同一个线程自己持有写锁时再去拿读锁,其本质相当于重入。
2022-10-30 20:24:25
644
原创 AbstractQueuedSynchronizer之AQS
和AQS有关的类ReentrantLock、CountDownLatch、ReentrantReadWriteLock、Semaphore等,里面关联有AQS的实现类。进一步理解锁和同步器的关系锁,面向锁的使用者:定义了程序员和锁交互的使用层API,隐藏了实现细节。同步器,面向锁的实现者:Java并发大神DougLee,提出统一规范并简化了锁的实现,将其抽象出来,屏蔽了同步状态管理、同步队列的管理和维护、阻塞线程排队和通知、唤醒机制等,是一切锁和同步组件实现的--------公共基础部分。
2022-10-30 14:56:52
421
1
原创 Synchronized与锁升级
锁升级以后,hashcode去哪了?锁升级为轻量级或重量级锁后,Mark Word中保存的分别是线程栈帧里的锁记录指针和重量级锁指针,已经没有位置再保存哈希码,GC年龄了,那么这些信息被移动到哪里去了呢?用书中的一段话来描述 锁和hashcode 之前的关系:在Java语言里面一个对象如果计算过哈希码,就应该一直保持该值不变(强烈推荐但不强制,因为用户可以重载hashCodc0方法按自己的意愿返回哈希码),否则很多依赖对象哈希码的API都可能存在出错风险。
2022-10-23 23:43:51
3600
4
原创 Java对象内存布局和对象头
在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)
2022-10-22 17:17:08
434
原创 ThreadLocal原理和使用
ThreadLocal中ThreadLocalMap的数据结构和关系?ThreadLocal的key是弱引用,这是为什么?ThreadLocal内存泄露问题你知道吗?ThreadLocal中最后为什么要加remove方法?变量和类型方法描述Tget()返回当前线程的此线程局部变量副本中的值。返回此线程局部变量的当前线程的”初始值”。voidremove()删除此线程局部变量的当前线程值。void将此线程局部变量的当前线程副本设置为指定值。创建一个线程局部变量。
2022-10-19 23:05:20
4261
原创 原子操作类
LongAdder的基本思路就是分散热点,将value值分散到一个Cell数组中,不同线程会命中到数组的不同槽中,各个线程只对自己槽中的那个值进行CAS操作,这样热点就被分散了,冲突的概率就小很多。如果要获取真正的long值,只要将各个槽中的变量值累加返回。sum()会将所有Cell数组中的value和base累加作为返回值,核心的思想就是将AtomicLong一个value的更新压力分散到多个value中去,从而降级更新热点。内部有一个base变量,一个Cell数组。
2022-10-13 23:11:38
352
原创 CAS理解
compare-and-swap的缩写,中文翻译成比较并交换,实现并发算法时常用到的一种技术。它包含三个操作数一一内存位置、预期原值及更新值。执行CAS操作的时候,将内存位置的值与预期原值比较:如果相匹配,那么处理器会自动将该位置值更新为新值,如果不匹配,处理器不做任何操作,多个线程同时执行CAS操作只有一个会成功。
2022-10-12 11:07:00
884
原创 内存屏障与指令重排
1.什么是内存屏障?2.内存屏障分类3.volatile中写屏障与读屏障的过程4.volatile禁止指令重排的行为5.重排的分类与执行流程
2022-10-09 22:47:58
805
原创 JMM中的happens-before原则
1.先行发生原则说明2.happens-before总原则3.happens-before之8条4.happens-before小总结
2022-10-09 22:00:37
314
原创 volatile总结
1.volatile可见性2.volatile禁止指令重排3.凭什么我们Java写了一个volatile关键字系统底层加入内存屏障?如何实现的?4.内存屏障是什么?5.内存屏障能干什么?6.内存屏障四大指令7.三句话总结
2022-10-09 20:50:00
304
原创 LockSupprt类使用
1.LockSupprt是什么?2.LockSupport类的主要方法3.三种让线程等待和唤醒的方法4.重点说明5.面试题6.官方说明
2022-10-08 10:04:56
273
原创 Java线程中断
1.什么是中断机制?2.中断的相关API方法之三大方法说明3.如何停止中断运行中的线程?4.当前线程中的中断标识为true,是不是线程就立即停止?5.关于静态方法Thread.interrupted()方法,谈谈你的理解
2022-10-06 21:46:53
3465
原创 volatile的深度理解
volatile是一种轻量级的同步机制。在原子性方面它仅能保障写 volatile 变量操作的原子性,但没有锁的排他性;volatile 关键字的使用不会引起上下文切换(所以被称为“轻量级” )。
2022-10-02 16:39:30
302
原创 @Autowired注解如何实现自动注入:
结论:@Autowired注解按照类型去IOC容器中查找bean对象,如果容器(即为IOC容器)中没有该类型对象(例如,该类型是个接口),则去容器中查找该类型的子类(实现类)的对象,进行注入。
2022-08-30 11:17:53
1451
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人