加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

并发问题原因分析及解决

发布时间:2021-05-26 23:27:36 所属栏目:语言 来源:互联网
导读:原子性 Unsafe.compareAndSwapXXX 实现CAS更改 state 和 队列指针 内部依赖CPU提供的原子指令 可见性与有序性 volatile 修饰 state 与 队列指针 (prev/next/hea

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)  

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读