站长网 语言 并发问题原因分析及解决

并发问题原因分析及解决

Unsafe.compareAndSwapXXX 实现CAS更改 state 和 队列指针 内部依赖CPU提供的原子指令 可见性与有序性 volatile 修饰 state 与 队列指针 (prev/next/head/tail) 线程阻塞与唤醒 Unsafe.park Unsafe.parkNanos Unsafe.unpark Unsafe类是在sun.misc包下,

Unsafe.compareAndSwapXXX 实现CAS更改 state 和 队列指针 内部依赖CPU提供的原子指令

可见性与有序性

volatile 修饰 state 与 队列指针 (prev/next/head/tail)

线程阻塞与唤醒

Unsafe.park Unsafe.parkNanos Unsafe.unpark

Unsafe类是在sun.misc包下,不属于Java标准。提供了内存管理、对象实例化、数组操作、CAS操作、线程挂起与恢复等功能,Unsafe类提升了Java运行效率,增强了Java语言底层的操作能力。很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty、Cassandra、Hadoop、Kafka等

AQS内部有两种模式:独占模式和共享模式

AQS 的设计是基于模板方法的,使用者需要继承 AQS 并重写指定的方法。不同的自定义同步器争用共享资源的方式不同,比如可重入、公平性等都是子类来实现。

自定义同步器在实现时只需要实现共享资源state的获取与释放方式即可,至于具体线程等待队列的维护(如获取资源失败入队/唤醒出队等),由AQS内部处理。

独占模式

 只有一个线程都能够获取到锁

 锁释放后需要唤醒后继节点

AQS提供的独占模式相关的方法

// 获取独占锁(线程阻塞直至获取成功)  

public final void acquire(int)  

// 获取独占锁,可被中断  

public final void acquireInterruptibly(int)   

// 获取独占锁,可被中断 和 指定超时时间  

public final boolean tryAcquireNanos(int, long)   

// 释放独占锁(释放锁后,将等待队列中第一个等待节点唤醒 )  

public final boolean release(int)  

本文来自网络,不代表站长网立场,转载请注明出处:https://www.tzzz.com.cn/html/biancheng/yuyan/2021/0525/6309.html

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部