CAS

CAS

我与影子孤独终老i 提交于 2020-02-13 14:42:56
CAS 比较并交换 CompareAndSwap 比较当前工作内存中的值和主内存中值,如果相同则执行规定操作,否则积蓄比较直到主内存和工作内存中的值一致为止。如果CCAS失败,会一直进行尝试。如果CAS长时间一致不成功,可能会给CPU带来很大的开销。 CAS操作包含三个操作数:内存位置(V)、预期原值(A)、新值(B),如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新增。 CAS的目的:利用CPU的CAS指令,同时借助JNI来完成java的非阻塞算法。 CAS存在的问题:虽然很高效的解决了原子操作,但是存在三大问题; (1) ABA问题; (2) 循环时间长开销大 (3) 只能保证一个共享变量的原子操作 Unsafe 是CAS的核心类,由于java方法无法直接访问底层系统,需要通过本地(native)方法来访问,Unsafe相当于一个后门,基于该类可以直接操作特定的内存的数据。 Unsafe类中的所有方法都是native修饰的,也就是说Unsafe类中的方法都直接调用操作系统底层资源执行相应任务。 变量 valueOffset, 表示该变量值在内存中的 偏移地址 ,因为Unsafe就是根据内存偏移地址获取数据的。 变量value用volatile修饰,保证了多线程之间的内存可见性。 解决ABA问题 AtomicReference原子引用 来源: https:/

取自阿里的15道Java并发编程常见面试题

橙三吉。 提交于 2020-02-13 13:19:56
最近有朋友去阿里面试回来和我聊天,他的简历之前我看过,在一家传统企业做后端开发的,有3年的工作经验,但是对于并发相关的经验不是很足。 在看过他的简历之后,我建议他看一些和并发有关的东西,但是他并没有听,回来之后找我吐槽: “我都明确说了自己没有并发编程经验,但是面试官还是抓着我问了很多相关的问题…” 然后说: “早知道我就听你的多看一些相关的知识了…” "可是我真的没有经验那,看了理论知识真的有用吗? " 对于他的这一连串问题,我只能说: 早就告诉你了你不听,我能怎么办。 以下,就是他事后靠回忆记起来的部分面试题,希望能够对你有所帮助 1、线程与进程的区别? 进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元。 一个程序至少有一个进程,一个进程至少有一个线程。 2、什么是多线程中的上下文切换? 多线程会共同使用一组计算机上的CPU,而线程数大于给程序分配的CPU数量时,为了让各个线程都有执行的机会,就需要轮转使用CPU。不同的线程切换使用CPU发生的切换数据等就是上下文切换。 3、死锁与活锁的区别,死锁与饥饿的区别? 死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 产生死锁的必要条件: 互斥条件:所谓互斥就是进程在某一时间内独占资源。 请求与保持条件:一个进程因请求资源而阻塞时

彻底理解synchronized

喜欢而已 提交于 2020-02-13 12:41:22
1. synchronized简介 在学习知识前,我们先来看一个现象: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class SynchronizedDemo implements Runnable { private static int count = 0; public static void main(String[] args) { for (int i = 0; i < 10; i++) { Thread thread = new Thread(new SynchronizedDemo()); thread.start(); } try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("result: " + count); } @Override public void run() { for (int i = 0; i < 1000000; i++) count++; } } 开启了10个线程,每个线程都累加了1000000次,如果结果正确的话自然而然总数就应该是10 * 1000000 = 10000000

tiny4412之内存控制器工作时序(DDR3 SDRAM)(二)

半腔热情 提交于 2020-02-13 11:01:52
Table of Contents 一、SDRAM 简易工作流程 二、tRCD 行列延迟RAS to CAS Delay 三、 CL(RL,Read Latency)读取潜伏期 四、tWR 写延迟 五、突发长度--(Burst Lengths) 六、预充电时间tRP 七、刷新时间 八、例说 一、SDRAM 简易工作流程 二、 tRCD 行列延迟 RAS to CAS Delay 行地址确定之后,就要对列地址进行寻址了。读写的信号和列地址是同时发过来的,读写的操作取决于WE#引脚,当他使能则为写,否则为读。 在发送列读写命令时必须要与行有效命令有一个间隔,这个间隔被定义为 tRCD,即 RAS to CAS Delay (RAS 至 CAS 延迟),大家也可以理解为行选通周期,简单说就是, 发完行地址再延迟tRCD时间发送列地址 ,这应该是根据芯片存储阵列电子元件响应时间(从一种状态到另一种状态变化的过程)所制定的延迟。 广义的 tRCD 以时钟周期(tCK,Clock Time)数为单位,比如 tRCD=2,就代表延迟周期为两个时钟周期,具体到确切的时间,则要根据时钟频率而定,对于PC100 SDRAM,tRCD=2,代表1000/100 * 2 = 20ns 的延迟,下图是tRCD=3的时序图。 三、 CL(RL,Read Latency) 读取潜伏期 在选定列地址后

新问题整理(高并发)

微笑、不失礼 提交于 2020-02-12 20:57:04
一、HashMap 是不是线程安全? HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中, 在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会出现死循环,所以HashMap是线程不安全的 (多线程会导致 HashMap 的 node 链表形成环状的数据结构产生死循环) 1.1、如何变得安全: Hashtable:通过 synchronized 来保证线程安全的,独占锁,悲观策略。吞吐量较低,性能较为低下 ConcurrentHashMap:JUC 中的线程安全容器,高效并发。ConcurrentHashMap 的 key、value 都不允许为 null 1.2、jdk1.8相对于jdk1.7的优化 由 数组+链表 的结构改为 数组+链表+红黑树。 拉链过长会严重影响hashmap的性能,所以1.8的hashmap引入了红黑树,当链表的长度大于8时,转换为红黑树的结构 优化了高位运算的hash算法:h^(h>>>16) 将hashcode无符号右移16位,让高16位和低16位进行异或。 二、ConcurrentHashMap 的实现方式 1.7

2020 Java面试题最新(五锁机制)

无人久伴 提交于 2020-02-10 17:44:28
锁的原因都是由并发问题发生的,在此我只是写一些面试中可能会问到的问题以及问题的答案,并不是给大家深入的讲解锁机制 一般面试官问都是从一个点引入一个点的问问题,所以我就先从线程问题引入到锁问题 1.说说线程安全问题 线程安全是多线程领域的问题,线程安全可以简单理解为一个方法或者一个实例可以在多线程环境中使用而不会出现问题 在 Java 多线程编程当中,提供了多种实现 Java 线程安全的方式: 最简单的方式,使用 Synchronization 关键字 使用 java.util.concurrent.atomic 包中的原子类,例如 AtomicInteger 使用 java.util.concurrent.locks 包中的锁 使用线程安全的集合 ConcurrentHashMap 使用 volatile 关键字,保证变量可见性(直接从内存读,而不是从线程 cache 读) 2.volatile 实现原理 在 JVM 底层 volatile 是采用“内存屏障”来实现的 缓存一致性协议(MESI协议)它确保每个缓存中使用的共享变量的副本是一致的。其核心思想如下:当某个 CPU 在写数据时,如果发现操作的变量是共享变量,则会通知其他 CPU 告知该变量的缓存行是无效的,因此其他 CPU 在读取该变量时,发现其无效会重新从主存中加载数据 3.synchronize 实现原理

Springboot集成Shiro和Cas实现单点登录(服务端篇CAS5)

时光总嘲笑我的痴心妄想 提交于 2020-02-09 23:08:09
什么是单点登录? 先说一个需求场景,比如:一个企业的内部有N多个子系统,每个子系统都有一套自己的用户名和密码,那么企业的员工要登录N个子系统,这样一个员工 就要记住N个用户名和密码,就算各个子系统的用户名和密码都是统一的,登录每个子系统都要输入用户名和密码进行登录也是一个繁琐的操作过程,那么单点登录功能由此便应运而生了。 单点登录 (Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 CAS架构图 这里直接说CAS整体架构是因为这不是一个入门教程,我已经默认你知道什么是SSO、什么是CAS,以及你已经装好了开发工具IDEA和Java环境Jdk1.8,并且你也知道什么是Web容器,知道Tomcat8.5+该从哪下载并启动部署,你也知道什么是Maven项目该怎么引入相关的jar包等等,所以如果你不具备以上这些知识,那么CAS服务端的学习我建议你还是先不要开始,弄清楚前面的知识点,才能畅通无阻的学习CAS服务端。 好了,这里先放架构图: 现在来讲解这个架构图: 首先搭建好CAS服务端后,服务端会自定义一个数据库和用户表,用户表中存放的是用户名和密码,通过访问子系统的URL地址,如果CAS系统判定你没有登录,就会将URL重定向到CAS的服务端登录界面

深入并发锁,解析Synchronized锁升级

六月ゝ 毕业季﹏ 提交于 2020-02-09 17:06:40
这篇文章分为六个部分,不同特性的锁分类,并发锁的不同设计,Synchronized中的锁升级,ReentrantLock和ReadWriteLock的应用,帮助你梳理 Java 并发锁及相关的操作。 一、锁有哪些分类 一般我们提到的锁有以下这些: 乐观锁/悲观锁 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁 上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面分别说明。 1、乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度,在Java和数据库中都有此概念对应的实际应用。 (1)乐观锁 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。 乐观锁适用于多读的应用类型,乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法,Java原子类中的递增操作就通过CAS自旋实现的。 CAS全称 Compare And Swap(比较与交换),是一种无锁算法。在不使用锁(没有线程被阻塞)的情况下实现多线程之间的变量同步。java.util.concurrent包中的原子类就是通过CAS来实现了乐观锁。 简单来说,CAS算法有3个三个操作数:

【协作式原创】查漏补缺之Golang中的锁

泄露秘密 提交于 2020-02-07 13:10:47
预备知识 CAS机制 1. 是什么 参考附录3 CAS 是项乐观锁技术,当多个线程尝试使用 CAS 同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并 不会被挂起 ,而是被告知这次竞争中失败,并可以再次尝试。 CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在 CAS 指令之前返回该位置的值。(在 CAS 的一些特殊情况下将仅返回 CAS 是否成功,而不提取当前值。) CAS 有效地说明了“ 我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。 ”这其实和乐观锁的冲突检查 + 数据更新的原理是一样的。 扩展: Q: 悲观锁和乐观锁的主要区别. A: 乐观锁每次获取数据的时候,都不会担心数据被修改,所以每次获取数据的时候都不会进行加锁,但是在更新数据的时候需要判断该数据是否被别人修改过。 悲观锁在读取数据也会加锁,甚至只能有1个线程可以读取数据。 2. 图解CAS 讲解参考附录1的图解. 内存地址v(该地址的内容是内存实际值) old值: 旧的预期值 new值: 要修改的新值 关键问题: Q: 什么叫冲突 A:

Java如何实现原子操作

不打扰是莪最后的温柔 提交于 2020-02-07 00:28:30
在Java中可以通过锁和循环CAS的方式来实现原子操作。 (1)使用循环CAS实现原子操作 ​ JVM中的CAS操作正是利用了处理器提供的CMPXCHG指令实现的。自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止。 (2)使用锁机制实现原子操作 ​ 锁机制保证了只有获得锁的线程才能够操作锁定的内存区域。JVM内部实现了很多种锁机制,有偏向锁、轻量级锁和互斥锁。有意思的是除了偏向锁,JVM实现锁的方式都用了循环CAS,即当一个线程想进入同步块的时候使用循环CAS的方式来获取锁,当它退出同步块的时候使用循环CAS释放锁。 来源: CSDN 作者: 徐海兴 链接: https://blog.csdn.net/u012326462/article/details/104201760