Java中如何使用Unsafe类实现高效的CAS操作及其原理详解?

2026-04-19 14:330阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计882个文字,预计阅读时间需要4分钟。

Java中如何使用Unsafe类实现高效的CAS操作及其原理详解?

一、复习+计算机内存模型,synchronized和volatile简介

二、两者对比+syncronized和volatile都解决了内存可见性问题

不同点:(1)前者是独占锁,存在持有者和上下文切换的开销及线程间通信;(2)后者不保证原子性,但能保证内存可见性。

一、复习

计算机内存模型,synchronized和volatile关键字简介

二、两者对比

sychronized和volatile都解决了内存可见性问题
不同点:
(1)前者是独占锁,并且存在者上下文切换的开销以及线程重新调度的开销;后者是非阻塞算法,不会造成上下文切换的开销。
(2)前者可以保证操作的原子性,但是后者不能保证操作的原子性。

三、在什么情况下才会使用volatile

  • 写入变量是不依赖当前值的,如果是依赖当前值的话,由于获取-计算-写入,三者不是原子性操作,而volatile是保证原子性操作的。
  • 变量没有加锁的时候,如果变量加锁了,是可以保证内存的可见性的因此不需要再使用volatile

四、Java中的原子性操作

  • 原子性操作通俗的来讲就是一组操作,要么都执行成功,要么都执行失败,不存在执行部分成功的情况
  • 使用synchronized关键字既可以保证操作的原子性又可以保证内存的可见性,volatile只能保证内存的可见性,但是不能保证操作的原子性;synchronized固然好,但在高并发的情况下,由于它是一种独占锁,因此会引起性能低下的问题。
阅读全文

本文共计882个文字,预计阅读时间需要4分钟。

Java中如何使用Unsafe类实现高效的CAS操作及其原理详解?

一、复习+计算机内存模型,synchronized和volatile简介

二、两者对比+syncronized和volatile都解决了内存可见性问题

不同点:(1)前者是独占锁,存在持有者和上下文切换的开销及线程间通信;(2)后者不保证原子性,但能保证内存可见性。

一、复习

计算机内存模型,synchronized和volatile关键字简介

二、两者对比

sychronized和volatile都解决了内存可见性问题
不同点:
(1)前者是独占锁,并且存在者上下文切换的开销以及线程重新调度的开销;后者是非阻塞算法,不会造成上下文切换的开销。
(2)前者可以保证操作的原子性,但是后者不能保证操作的原子性。

三、在什么情况下才会使用volatile

  • 写入变量是不依赖当前值的,如果是依赖当前值的话,由于获取-计算-写入,三者不是原子性操作,而volatile是保证原子性操作的。
  • 变量没有加锁的时候,如果变量加锁了,是可以保证内存的可见性的因此不需要再使用volatile

四、Java中的原子性操作

  • 原子性操作通俗的来讲就是一组操作,要么都执行成功,要么都执行失败,不存在执行部分成功的情况
  • 使用synchronized关键字既可以保证操作的原子性又可以保证内存的可见性,volatile只能保证内存的可见性,但是不能保证操作的原子性;synchronized固然好,但在高并发的情况下,由于它是一种独占锁,因此会引起性能低下的问题。
阅读全文