并发问题原因分析及解决

原子性

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提供的独占模式相关的方法


  1. // 获取独占锁(线程阻塞直至获取成功)  
  2. public final void acquire(int)  
  3. // 获取独占锁,可被中断  
  4. public final void acquireInterruptibly(int)   
  5. // 获取独占锁,可被中断 和 指定超时时间  
  6. public final boolean tryAcquireNanos(int, long)   
  7. // 释放独占锁(释放锁后,将等待队列中第一个等待节点唤醒 )  
  8. public final boolean release(int)  

AQS子类需要实现的独占模式相关的方法


  1. // 尝试获取独占锁  
  2. protected boolean tryAcquire(int)  
  3. // 尝试释放独占锁  
  4. protected boolean tryRelease(int) 
【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章