CAS

原子操作类 CAS

一个人想着一个人 提交于 2020-11-21 02:06:44
戳 蓝色字“ 码之初 ”关注,每天都进步! 来源: https://www.zhangjianbing.com/archives/54/ CAS (compare and swap),即:比较然后交换。 CAS 的原理 三个运算符:一个内存地址 V,一个期望值 A,一个新值 B。 基本思路:如果地址 V 上的值和期望值 A 相等,返回 true,并给地址 V 赋上新值 B,如果不是,返回 false,不做任何操作。 循环 (死循环,或者叫自旋) 里不断的进行 CAS 操作。 现代处理器都支持 CAS 的指令,循环这个指令,直到成功为止。 CAS 所带来的问题 1.ABA 问题。 所谓的 ABA 问题就是假设某个内存地址上有一个数值 A,但一个线程过来后把它变成了 B,然后又变回了 A,另一个线程过来后,发现内存地址上的值和期望的值一样,故 CAS 成功了,其实,内存地址上的值发生了变化,这种问题可以用加版本号的方式来解决。下面代码会演示。 2. 系统开销问题。 当一个 CAS 操作永远不成功,它就会一直自旋,系统开销巨大,遇到这种情况,我们只能使用 syn 锁或者其他锁的方式来替代 CAS 操作了。 3. 只能保证一个共享变量的原子操作。 就是只能够保证一个共享变量,如果想保证多个变量的话,可以将这些变量放入一个引用变量中,atomic 为我们提供了操纵引用变量的类,叫

一文读懂联邦认证

只谈情不闲聊 提交于 2020-11-21 00:34:29
什么是联邦认证 在互联网早期,你的各类账号信息分散在不同的站点和应用,这存在以下问题: 每次访问一个新的站点都要注册一个新的用户名和密码账号。 这个账户就仅仅被存储在这个站点。 你无法在不同的站点下保持登录,用户的信息在不同的站点间也无法互通。 联邦认证通过 标准协议 将不同的身份提供商 联合起来 对用户进行认证。 联邦 是一种身份提供商之间的 信任关系 ,建立联邦关系的身份提供商之间可以通过 标准协议 互相拉取用户信息。 为什么需要联邦认证 联邦认证是一种 分布式 的身份认证,当用户在 身份提供商 登录时,用户可以选择到当前身份提供商 信任的联邦身份提供商 登录。用户可以通过联邦认证登录一个新的系统,而不必每次在新的系统中注册账号。例如现在许多网站有自己的 账密注册 登录方式,也有微信扫码直接登录的方式,其中的微信就是这个网站的 身份联邦 ,用户 不必填写信息 注册账号, 直接使用微信 就可以登录。 使用联邦认证有以下好处: 用户不必每次都要创建一个全新的账号。 接入联邦认证后用户可以在不同的组织和站点中畅游。 联邦认证原理 以下是联邦认证的过程,用户被重定向到身份联邦进行认证,用户先在身份联邦认证,身份联邦认证向 Authing 发送身份断言,等价于用户在 Authing 完成认证,Authing 再向业务系统发送身份断言,业务系统完成登录。 Authing 的联邦认证能力

信不信这些Java面试题,可以把70%程序员劝退?(附带答案讲解)

六眼飞鱼酱① 提交于 2020-11-21 00:31:33
上一篇文章我写了阿里面试官认证的一些非常不错的面试题和一些学习的思路,但是因为文章太长了就分为了两个部分来完成,所以这一篇文章就把最后写的Java面试带上答案一同码了出来,以下为解答大纲,部分作了扩展。 1.private修饰的方法可以通过反射访问,那么private的意义是什么 这题是一道思想题目,天天会碰到private,有没有想过这个问题? 谈谈对java设计的认识程度,主要抓住两点: 1.java的private修饰符并不是为了绝对安全性设计的,更多是对用户常规使用java的一种约束; 2.从外部对对象进行常规调用时,能够看到清晰的类结构。 2.Java类初始化顺序 先说结论: 基类静态代码块,基类静态成员字段(并列优先级,按照代码中出现的先后顺序执行,且只有第一次加载时执行)——>派生类静态代码块,派生类静态成员字段(并列优先级,按照代码中出现的先后顺序执行,且只有第一次加载时执行)——>基类普通代码块,基类普通成员字段(并列优点级,按代码中出现先后顺序执行)——>基类构造函数——>派生类普通代码块,派生类普通成员字段(并列优点级,按代码中出现先后顺序执行)——>派生类构造函数 代码验证: class Log { public static String initLog(String log) { System.out.println(log);return null;

什么是STT-MRAM?

强颜欢笑 提交于 2020-11-20 04:22:00
随着有希望的非易失性存储器架构的可用性不断增加,以增加并潜在地替代传统的易失性存储器,新的SoC级存储器测试和修复挑战正在出现。通过将自旋转移扭矩 MRAM (STT-MRAM)作为嵌入式MRAM技术的领先趋势来增强动力. 什么是STT-MRAM? 嵌入式存储器IP选项包括STT-MRAM,相变存储器(PCM),电阻RAM(ReRAM)和铁电RAM(FRAM)。每种新兴的内存技术都不同,适合特定的应用,但STT-MRAM似乎已成为主流。 STT-MRAM 是一种电阻存储技术,其中材料中电子的磁性自旋变化会产生可测量的电阻率变化。从概念上讲,每个单元由两个磁体组成:一个是固定的,另一个是可以翻转的。当磁体彼此平行时,电阻低。当第二个磁铁反转方向时,电阻很高。 由于磁性隧道结(MTJ)器件能够通过仅三个额外的掩膜嵌入芯片的线路后端(BEOL)互连层,因此STT-MRAM技术享有低功耗和低成本的优势。在商业代工厂中,STT-MRAM的支持正在加速发展,GlobalFoundries,英特尔,三星,台积电和联电都已公开宣布为28nm / 22nm技术的SoC设计人员提供产品。 系统设计师正在将STT-MRAM技术用于低功耗MCU设计(例如IoT穿戴式设备),这些设计可以从较小的芯片尺寸中受益。STT-MRAM通常会为这些早期采用者取代嵌入式闪存。对于自动驾驶雷达SoC,STT

Sdram控制器(一)

狂风中的少年 提交于 2020-11-18 20:05:17
今天主要学习Sdram控制器框架设计 首先来看下整个控制器设计框图 如图1所示 (图1 FPGA内部程序框图) 接下来,分模块来看一下 1.1 时钟产生模块 1.11 实现方式 时钟的输入来源于外部晶振,时钟频率为25MHz,通过PLL产生数据源的时钟62.5MHz和sdram的工作时钟166MHz。另外还需要产生一个相移为180°的166MHz提供给下游芯片sdram,保证时钟在数据中间采 样。 1.12 参数设计 参数设计如图2所示 (图2 PLL参数设计) 1.13 接口设计 1.14 重点问题 Locked信号需要等锁相环锁定时钟后,输出的时钟才能有效,此PLL设计使用的是高有效的复位。 1.2 数据源产生模块 1.21 实现方式 数据源产生模块使用PLL倍频出来的 62.5MHz 时钟,产生数据格式如下: Addr[8:0] 0 1 2 … 2 53 2 54 2 55 Data[31:0] 0 1 2 … 2 53 2 54 s um 1.22 顶层设计 En表示什么时候产生数据,顶层结构如图3所示。 ( 图3 数据源产生模块顶层设计 ) 1.23 接口设计 1.24 重点问题 产生的数据是以256为一块,最后一个数是前面所有数据的累加和。 1.3 Rdm读写模块 该模块 XILINX 公司提供的使用简单双端口 RAM IP 核。 1.3.1 实现方式

STM32F429驱动SDRAM

∥☆過路亽.° 提交于 2020-11-18 18:44:31
1 FMC   STM32F429以外的控制器中,只有FSMC(可变静态存储控制器),不能驱动SDRAM这样的动态存储器,因为驱动SDRAM时需要定时刷新。STM32F429的FMC才支持该功能,且只支持普通的SDRAM,不支持DDR类型的SDRAM。 FMC可以用于驱动SRAM、SDRAM、NOR FLASH以及NAND FLASH类型的存储器。 1.1 通信引脚 SDRAM引脚 FMC引脚 说明 CLK FMC_SDCLK 同步时钟信号 CKE FMC_SDCKE1 时钟使能信号 CS FMC_SDNE1 片选信号 CAS FMC_NCAS 列地址选通 RAS FMC_NRAS 行地址选通 WE FMC_SDNWE 写使能 DQM[0:1] FMC_NBL[0:1] 数据输入/输出掩码信号 BA[0:1] FMC_A[14:15] SDRAM芯片内部Bank地址输入 A[0:11] FMC_A[0:11] 地址输入 DQ[0:15] FMC_D[0:15] 数据输入/输出 CKE和CS作用: FMC_SDCKE0,FMC_SDCLK0:FMC映射的SDRAM的存储区域Bank1 FMC_SDCKE1,FMC_SDCLK1:FMC映射的SDRAM的存储区域Bank2 1.2 地址映射 FMC_SDCKE0,FMC_SDCLK0:FMC映射的SDRAM的存储区域Bank1

第26章 FMC—扩展外部SDRAM

天大地大妈咪最大 提交于 2020-11-18 18:44:05
本章参考资料:《 STM32F76xxx 参考手册 2 》、《 STM32F7xx 规格书》、库帮助文档《 STM32F779xx_User_Manual.chm》。 关于 SDRAM 存储器,请参考前面的“ 常用存储器介绍 ”章节,实验中 SDRAM 芯片的具体参数,请参考其规格书《 W9825G6KH 》来了解。 26.1 SDRAM 控制原理 STM32 控制器芯片内部有一定大小的 SRAM 及 FLASH 作为内存和程序存储空间,但当程序较大,内存和程序空间不足时,就需要在 STM32 芯片的外部扩展存储器了。 STM32F767 系列芯片扩展内存时可以选择 SRAM 和 SDRAM ,由于 SDRAM 的“容量 / 价格”比较高,即使用 SDRAM 要比 SRAM 要划算得多。我们以 SDRAM 为例讲解如何为 STM32 扩展内存。 给 STM32 芯片扩展内存与给 PC 扩展内存的原理是一样的,只是 PC 上一般以内存条的形式扩展,内存条实质是由多个内存颗粒 ( 即 SDRAM 芯片 ) 组成的通用标准模块,而 STM32 直接与 SDRAM 芯片连接。见 图 26-2 ,这是一种型号为 W9825G6KH 的 SDRAM 芯片内部结构框图,以它为模型进行学习。 图 26 -1 SDRAM 芯片外观 图 26 -2 一种 SDRAM 芯片的内部结构框图 26.1.1

阿里一道面试题把90%的程序员拦在了门外

妖精的绣舞 提交于 2020-11-17 03:44:20
兄弟们,大家好。时隔多天,我,终于来了。今天我们来聊一下让人神魂颠倒的 Synchronized 。 不过呢,在读这篇文章之前,我希望你真正使用过这个东东,或者了解它到底是干嘛用的,不然很难理解这篇文章讲解的东西。 这篇文章的大体顺序是:从 无锁-->偏向锁-->轻量级锁-->重量级锁 讲解,其中会涉及到 CAS , 对象内存布局 ,缓存行等等知识点。也是满满的干货内容。其中也夹杂了个人在面试过程中出现的面试题,各位兄弟慢慢享受。 Synchronized 在 jdk1.6 做了非常大的优化,避免了很多时候的用户态到内核态的切换,节省了资源的开销,而这一切的前提均来源于 CAS 这个理念。下面我们先来聊一下 CAS 的一些基本理论。 1. CAS CAS 全称: CompareAndSwap ,故名思意:比较并交换。他的主要思想就是: 我需要对一个值进行修改,我不会直接修改,而是将当前我认为的值和要修改的值传入,如果此时内存中的确为我认为的值,那么就进行修改,否则修改失败。 他的思想是一种乐观锁的思想。 一张图解释他的工作流程: 知道了它的工作原理,我们来听一个场景:**现在有一个 int 类型的数字它等于1,存在三个线程需要对其进行自增操作。** 一般来说,我们认为的操作步骤是这样:线程从主内存中读取这个变量,到自己的工作空间中,然后执行变量自增,然后回写主内存

线程池ForkJoinPool简介

好久不见. 提交于 2020-11-17 03:41:44
ForkJoinPool 线程池最大的特点就是分叉(fork)合并(join),将一个大任务拆分成多个小任务,并行执行,再结合工作窃取模式( worksteal )提高整体的执行效率,充分利用CPU资源。 一. 应用场景 ForkJoinPool 使用分治算法,用相对少的线程处理大量的任务,将一个大任务一拆为二,以此类推,每个子任务再拆分一半,直到达到最细颗粒度为止,即设置的阈值停止拆分,然后从最底层的任务开始计算,往上一层一层合并结果,简单的流程如下图: 从图中可以看出ForkJoinPool要先执行完子任务才能执行上一层任务,所以ForkJoinPool适合在有限的线程数下完成有父子关系的任务场景,比如:快速排序,二分查找,矩阵乘法,线性时间选择等场景,以及数组和集合的运算。 下面是个简单的代码示例计算从1到1亿之间所有数字之和: package com.javakk; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask; import java.util.stream.LongStream; /** * ForkJoinPool求和 * @author 老K */ public class ForkJoinPoolTest { private static

独角兽余额宝(Java现场面试48题):JVM调优+索引+缓存+HashMap+GC

此生再无相见时 提交于 2020-11-15 19:15:36
余额宝一面 介绍一下自己。 JVM 内存分哪几个区,每个区的作用是什么?JVM有哪些回收算法,对应的收集器有哪些? JVM,垃圾回收机制,内存划分等 GC 的两种判定方法 ?CMS 收集器与 G1 收集器的特点。 HashMap中的get()方法是如何实现的? HashMap、HashMap如何保证线程安全、ConcurrentHashMap HashMap底层结构 put操作讲一下 GC 的两种判定方法 ?CMS 收集器与 G1 收集器的特点。 java线程同步都有哪几种方式,在 Java 中 CycliBarriar 和 CountdownLatch 有什么区别? cas的原理,变量要用哪个关键字修饰,volatile实现的原理。 你在多线程环境中遇到的常见的问题是什么?你是怎么解决它的? MYSQL 数据库服务器性能分析的方法命令有哪些? SQL优化,常用的索引? 手撕代码:按层次遍历二叉树? Java 配置的方式配置 Spring spring中用到了什么, 简述 AOP 和 IOC 概念,aop是怎么实现的? 第一轮非常重要,第一面能通过,后续被录用的可能性就比较高了,建议系统性的学习面试题目 余额宝二面 项目用 Spring 比较多,有没有了解 Spring 的原理?AOP 和 IOC 的原理 对哪些技术比较熟悉? 分布式锁原理 乐观锁如何保证线程安全? CAS 算法