Synchronized 显然是一个悲观锁,因为它的并发策略是悲观的: 不管是否会产生竞争,任何的数据操作都必须要加锁、用户态核心态转换、维护锁计数器和检查是否有被阻塞的线程需要被唤醒等操作。 随着硬件指令集的发展,我们可以使用基于冲突检测的乐观并发策略。先进行操作,如果没有其他线程征用数据,那操作就成功了; 如果共享数据有征用,产生了冲突,那就再进行其他的补偿措施。这种乐观的并发策略的许多实现不需要线程挂起,所以被称为非阻塞同步。 乐观锁的核心算法是 CAS(Compareand Swap,比较并交换),它涉及到三个操作数:内存值、预期值、新值。当且仅当预期值和内存值相等时才将内存值修改为新值。 这样处理的逻辑是,首先检查某块内存的值是否跟之前我读取时的一样,如不一样则表示期间此内存值已经被别的线程更改过,舍弃本次操作,否则说明期间没有其他线程对此内存值操作,可以把新值设置给此块内存。 CAS 具有原子性,它的原子性由 CPU 硬件指令实现保证,即使用 JNI 调用 Native 方法调用由 C++ 编写的硬件级别指令,JDK 中提供了 Unsafe 类执行这些操作。
详细解决方案
为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是 CAS,它有什么特性?
热度:96 发布时间:2023-12-05 18:22:00.0
相关解决方案
- synchronized 同步方法不起作用,该如何处理
- synchronized 学习(1)
- synchronized 的有关问题,木木哒
- 一个线程加一演算,一个线程做减一运算,多个线程同时交替运行-synchronized
- synchronized 与 wait 的有关问题
- public synchronized static 获取序列号如何会主键冲突
- 请帮助解释的多线程的执行顺序有关问题,先多谢!synchronized
- synchronized 有关问题
- synchronized (this)的意思解决思路
- 关于 synchronized 的疑问解决方案
- synchronized 方法 和 synchronized代码块 竞争的是同一把锁吗?解决方法
- Collections.synchronized,该如何解决
- synchronized wait notify,该怎么解决
- Java Concurrent--线程安全性(synchronized)
- synchronized(this)引发的线程不安全问题
- synchronized 和 ReentrantLock 的区别
- synchronized and Lock
- 《java笔记系列》synchronized
- synchronized、volatile、CAS 比较
- 为 什 么 说 Synchronized 是 一 个 悲 观 锁 ?
- 跟 Synchronized 相比,可重入锁 ReentrantLock 其实现原理有什么不同?
- 请尽可能详尽地对比下 Synchronized 和 ReentrantLock 的异同
- 为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是 CAS,它有什么特性?
- 为什么说 Synchronized 是非公平锁?
- 什么是可重入性,为什么说 Synchronized 是可重入锁?
- Synchronized 用过吗,其原理是什么?
- synchronized 的底层怎么实现的
- synchronized 关键字的java应用
- 单例模式之懒汉的并发问题,只需要添加一个 synchronized 就可以解决了
- synchronized 加锁保证线程安全