JUC
文章平均质量分 92
JUC
小周同志啊
这个作者很懒,什么都没留下…
展开
-
AQS 巨好理解的版本
当调用 reset() 方法时,无论当前线程是否已经到达栅栏,所有已经到达栅栏但还在等待的线程都会被中断(抛出 BrokenBarrierException 异常),并且栅栏会重置为初始状态。CONDITION(-2):表示结点等待在Condition上,当其他线程调用了Condition的signal()方法后,CONDITION状态的结点将从等待队列转移到同步队列中,等待获取同步锁。调用singal/singalAll的线程:条件队列转同步队列,可以在释放锁的时候唤醒head的后续节点所在的线程。原创 2024-03-25 20:05:13 · 1061 阅读 · 0 评论 -
Voliate
第二步和第三步可以进行指令重排,如果instance没有被volatile修饰,那么线程A可能先将对象复制给变量,然后在调用构造函数初始化,在初始化的过程中,线程B也来调用getInstance(),会发生instance不为空,会直接返回instance对象,但Singleton类未初始化,会报错。当其他线程感应到这个变量的写操作时,它们会将自己的缓存行状态设置为Invalid,这样可以确保它们在后续的读取操作中能够从主存中获取最新的值。变量的读写操作在多线程环境中是可见的,保证了内存的可见性和有序性。原创 2024-03-18 18:19:39 · 940 阅读 · 0 评论 -
ConcurrentHashMap
在JDK7下,采用的分段锁的方式来保证数据安全,为每段数据分配一个锁,同时其他段的数据可以被其他线程访问。ConcurrentHashMap 由segmentHashEntry组成,segment 内部实现了 ReetrantLock,一个 segment 守护一个 HashEntry,所以当几个线程竞争 HashEntry时,会用对应的ReentrantLock进行加锁。在JDK8下, ConcurrentHashMap 数据结构同 jdk8 中的 HashMap 数据结构一样,都是数组+链表+红黑树。原创 2024-03-11 23:54:55 · 953 阅读 · 0 评论 -
Synchoronized
Synchronzied 是一个java内置锁,属于悲观锁,悲观锁每次读写都会加锁。JDK6之前,是基于Monitor机制实现的,依赖于底层互斥原话Mutex,属于重量级锁,性能较低JDK6之后,迫于JUC包的压力,对synchronzied进行了优化,增加锁升级、锁消除、锁粗化等机制,sync为了避免阻塞直接从用户态切换到内核态park线程,所以默认情况下是开启偏向锁,当然也可以禁用偏向锁,这样锁升级就会从无锁开始。原创 2024-03-11 16:52:10 · 817 阅读 · 1 评论