锁、volatile、CAS的比较
一、锁
锁是一种悲观的机制。为多线程提供了互斥的访问机制。多个线程同时竞争锁时,没获得锁的线程将会被挂起(智能的JVM会根据之前获取锁操作中对锁的持有时间长短来判断是使线程挂起还是自旋)
锁的劣势:
1.未竞争到锁的线程挂起后再恢复时,会进行上下文的切换,开销大。
2.当一个线程正在等待锁时,它不能干任何其它事情。
如果持有锁的线程被延迟执行(例如发生了缺页错误、调度延迟、或者其它类似情况),那么所有需要该锁的线程都必须等待下去。
如果被阻塞线程的优先级较高,而持有锁的线程优先级较低,那么这将是一个严重的问题——优先级反转。即使高优先级的线程可以抢先执行,但仍然需要等待锁被释放,从而导致它的优先级会降至低优先级线程的级别。
如果持有锁的线程被永久阻塞(例如由于出现无限循环,死锁,活锁或者其他的活跃性障碍),所有等待这个锁的线程就永远无法执行下去。
二、volatile
与锁相比,volatile是一种更轻量级的同步机制。
volatile的优势:在使用这些变量时,不会发生上下文切换和线程调度等操作。
volatile的局限:不能保证复合操作的原子性。例如i++,并不能通过volatile来保证原子性。
三、CAS
对于细粒度操作,除了volatile提供的轻量级的同步机制,还有另外一种更高效的乐观方法。
在针对多处理器操作而设计的处理器中提供了一些特殊指令,用于管理对共享数据的并发访问。
现在,几乎所有的现代处理器中都包含了某种形式的原子读-改-写指令,例如比较并交换(compare and swap)、关联加载/条件存储(load linked/store conditional)。操作系统和JVM使用这些指令来实现锁和并发的数据结构。
四、锁与原子变量的比较 以及 非阻塞算法
请参考《Java并发编程实战》第15章
总结
1.锁的优缺点?
2.volatile的优缺点?
3.什么是CAS?其原理、优势?
4.JVM如何支持CAS的?
5.什么是ABA问题?如果解决?
参考资料:《Java并发编程实战》
锁、volatile、CAS的比较的更多相关文章
- paip.提升性能----java 无锁结构(CAS, Atomic, Threadlocal, volatile, 函数式编码, 不变对象)
paip.提升性能----java 无锁结构(CAS, Atomic, Threadlocal, volatile, 函数式编码, 不变对象) 1 锁的缺点 2 CAS(Compare ...
- 无锁算法CAS 概述
无锁算法CAS 概述 JDK5.0以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent包中,是专门用于多线并发编程的,充分利用了现代多处理器和多核心系统的功能以编写大 ...
- Java 中的各种锁和 CAS + 面试题
Java 中的各种锁和 CAS + 面试题 如果说快速理解多线程有什么捷径的话,那本文介绍的各种锁无疑是其中之一,它不但为我们开发多线程程序提供理论支持,还是面试中经常被问到的核心面试题之一.因此下面 ...
- 基础篇:详解锁原理,volatile+cas、synchronized的底层实现
目录 1 锁的分类 2 synchronized底层原理 3 Object的wait和notify方法原理 4 jvm对synchronized的优化 5 CAS的底层原理 6 CAS同步操作的问题 ...
- [数据库锁机制] 深入理解乐观锁、悲观锁以及CAS乐观锁的实现机制原理分析
前言: 在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数据库都提供了锁机制,并引入了事务隔离级别的概念.数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务 ...
- JAVA之锁-volatile
锁是JAVA多线程关键,也是面试中必问的, 在此好好总结一下. (先要从进程和线程说起,此处先欠下,回头专门说一下操作系统是怎么管理进程和线程的) 说到多线程就要说说JAVA的内存模型:图片来自于网络 ...
- volatile CAS
减少上下文切换的方法有无锁并发编程.CAS算法.使用最少线程和使用协程. 无锁并发编程.多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一 些办法来避免使用锁,如将数据的ID按照Hash ...
- (一)juc线程高级特性——volatile / CAS算法 / ConcurrentHashMap
1. volatile 关键字与内存可见性 原文地址: https://www.cnblogs.com/zjfjava/category/979088.html 内存可见性(Memory Visibi ...
- 乐观锁和悲观锁及CAS实现
乐观锁与悲观锁 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁.传统的关系型数据库里边就用到了很多这种锁机制, ...
- java 多线程12 : 无锁 实现CAS原子性操作----原子类
由于java 多线程11:volatile关键字该文讲道可以使用不带锁的情况也就是无锁使变量变成可见,这里就理解下如何在无锁的情况对线程变量进行CAS原子性及可见性操作 我们知道,在并发的环境下,要实 ...
随机推荐
- 项目一、ajax上传数据(显示进度条)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 取得所有网卡的MAC地址,包括禁用的
先在nuget包中添加System.Management.Automation引用. 然后下面就是代码了. using System;using System.Collections.ObjectMo ...
- Qualcomm 8X camera过程解析【转】
本文转载自:http://blog.csdn.net/gabbzang/article/details/19906687 http://www.01yun.com/mobile_development ...
- RAC容灾演练
RAC容灾演练:在节点一进行验证:步骤 操作命令关闭步骤 检测RAC集群资源状态 crsctl status resource -t 关闭监听 srvctl stop listener -n < ...
- cookie格式化
#coding=utf- import requests url = 'http://www.baidu.com' f=open(r'cookies.txt','r') cookies={} for ...
- Spring Cloud Stream 使用延迟消息实现定时任务(RabbitMQ)
应用场景 通常在应用开发中我们会碰到定时任务的需求,比如未付款订单,超过一定时间后,系统自动取消订单并释放占有物品. 许多同学的第一反应就是通过spring的schedule定时任务轮询数据库来实现, ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_4_transient关键字_瞬态关键字
不想被序列化的成员变量用 transient修饰 age加上static关键字 反序列化age就读取不到正确的值了
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_06 Set集合_2_哈希值
没有重写就是十进制的整数,重写了想返回多少就是多少. 创建Person类,没有写继承关系,默认会继承Object类 打开Object这个类 找到HashCode这个方法.就这一行代码.甚至都没有方法体 ...
- 测开之路一百:jquery引用、语法、事件
工作中一般会使用jquery代替js,jquery官网:https://jquery.com/ 引用jquery: 第一种方式:下载引用: jquery下载官网:https://jquery.com/ ...
- beyond compare 4.2.9桌面右键集成的问题修复
beyond compare 4.2.9桌面右键集成的问题修复 安装后,发现在WIN64时,注册表中注册的DLL库有问题 出错处: [HKEY_CLASSES_ROOT\CLSID\{57FA2D12 ...