原子

Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

心不动则不痛 提交于 2019-11-28 04:55:48
首先介绍一些乐观锁与悲观锁:   悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如 Java里面的同步原语 synchronized关键字的实现也是悲观锁 。   乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁, 但是在更新的时候会判断一下在此期间别人有没有去更新这个数据 ,可以使用版本号等机制。 乐观锁适用于多读的应用类型 ,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在 Java中java.util.concurrent.atomic包下面的 原子变量类就是使用了乐观锁的一种实现方式CAS实现的 。 乐观锁的一种实现方式-CAS(Compare and Swap 比较并交换):   锁存在的问题:      Java在JDK1.5之前都是靠 synchronized关键字保证同步的 ,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程持有共享变量的锁,都采用独占的方式来访问这些变量。这就是一种独占锁,独占锁其实就是一种悲观锁,所以可以说 synchronized 是悲观锁。  

Java并发编程--Volatile详解

北城余情 提交于 2019-11-28 02:28:23
摘要 Volatile是Java提供的一种弱同步机制,当一个变量被声明成volatile类型后编译器不会将该变量的操作与其他内存操作进行重排序。在某些场景下使用volatile代替锁可以减少代码量和使代码更易阅读。 Volatile特性 1.可见性:当一条线程对volatile变量进行了修改操作时,其他线程能立即知道修改的值,即当读取一个volatile变量时总是返回最近一次写入的值 2.原子性:对于单个voatile变量其具有原子性(能保证long double类型的变量具有原子性),但对于i ++ 这类复合操作其不具有原子性(见下面分析) 使用volatile变量的前提 1.对变量的写入操作不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值 2.该变量不会与其他状态变量一起纳入不变性条件中 3.在访问变量时不需要加锁 volatile可见性 volatile的可见性正是基于happend -before(先行发生)关系实现的。 happend-before:java内存模型有八条可以保证happend-before的规则(详见《深入理解Java虚拟机》P376),如果两个操作之间的关系无法从这八条规则中推导出来的话,它们就没有顺序保障,虚拟机就可以对它们随意地进行重排序. 其中就包含”volatile变量规则“

vue 中使用particles.js

时光总嘲笑我的痴心妄想 提交于 2019-11-27 19:18:10
1. particles.js 是什么? --- 轻量级JavaScript粒子库 , gitHub 地址可以下载示例代码,示例代码为DOM开发形式: https://github.com/VincentGarreau/particles.js 2. 效果就不给看了,公司的内部网站。直接上代码 //(1) 下载particles.js npm install particles.js --save //(2) 在template里面写一个div作为粒子库的容器 ,就像canvas那样 <div id="particlesId"></div> //(3) 创建粒子库的配置文件,particles.json , 建议放在public静态资源文件夹 https://www.jb51.net/article/123527.htm 这个配置地址里有两个,我认为不好看 http://www.jq22.com/jquery-info20054 这个里面很漂亮,配置参数注释详细 为了方便,我直接将我认为漂亮的配置particles.json粘贴过来 { "particles": { "number": { "value": 160,//数量 "density": { "enable": true, //启用粒子的稀密程度 "value_area": 800 //区域散布密度大小 } },

redis处理库存问题

谁都会走 提交于 2019-11-27 14:20:11
12月份重构公司社群活动产品,原来自己不是很成熟,按传统的形式处理卖票的信息-现在回首很多地方都会出问题。 先说下背景:业务是卖票!所以自然而然会遇到高并发下的库存问题 搜了很多网上提供以下几种方案: 1.并发数很小,不考虑并发的话采用Redis的原子操作。缺点也很显然,高并发肯定是有问题的!对应方案如下 http://blog.csdn.net/wujiangwei567/article/details/51210600 2.高并发请求采用队列形式,化解为单线程。消费时再使用Redis原子操作加减库存 3.采用Redis的分布式锁 现在采用的第三种方式 来源: CSDN 作者: 天降爆米花 链接: https://blog.csdn.net/dream20nn/article/details/53490147

并发数据结构:迷人的原子

℡╲_俬逩灬. 提交于 2019-11-26 21:44:31
随着多核CPU成为主流,并行程序设计亦成为研究领域的热门。 要想利用多核/多路CPU带来的强大功能,通常使用多线程来开发应用程序。但是要想拥有良好的硬件利用率,仅仅简单的在多个线程间分割工作是不够的。还必须确保线程大部分时间在工作,而不是在等待工作或等待锁定共享数据结构。 在不止一个线程访问共享数据时,所有线程都必须使用同步。如果线程间不进行协调,则没有任务可以真正并行,更糟糕的是这会给程序带来毁灭性的错误。 现在让我们来看一下在.NET和D语言中的标准同步手段-锁定。.NET下我们使用lock关键字,而D语言则使用 synchronized关键字。它们在Windows下均使用临界区(Critical Section)来实现,而在Linux下则使用互斥锁(Mutex)来实现。不论其如何实现,它们均强制实行互斥,来确保持有锁的线程对共享数据的独占访问权,以及当其他线程持有锁时,可以看到其对共享数据的修改。 简而言之,在基于锁的多线程编程中,任何针对共享数据,且有可能导致竞争条件的操作,我们都得将其改为原子操作(即连续的,不允许被打断的步骤;上面的lock/ synchronized 关键字就是我们实现原子操作的手段)。只要我们的线程持有锁,就不必担心其他线程会进来捣乱。 这听起来似乎很不错,我们只要加锁/解锁就可以为所欲为了。然而正是这种为所欲为的事实带来了问题

volatile的工作原理

邮差的信 提交于 2019-11-26 20:59:19
volatile的特性: volatile可见性:对一个volatile的读,总可以看到对这个变量最终的写; volatile原子性:volatile对单个读/写具有原子性(32位Long、Double),但是复合操作除外,例如:i++; jvm底层采用“内存屏障”来实现volatile语义。 volatile的内存语义及实现:   在JMM中,线程之间的通信采用共享内存来实现的。 volatile内存语义是: 当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新到主内存中; 当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,直接从主内存中读取共享变量。 volatile的底层实现是通过插入内存屏障,但是对于编译器来说,发现一个最优布置来最小化插入内存屏障的总数几乎是不可能的,所以,JMM采用保守策略。如下: 在每一个volatile写操作前面插入一个StoreStore屏障 在每一个volatile写操作后面插入一个StoreLoad屏障 在每一个volatile读操作后面插入一个LoadLoad屏障 在每一个volatile读操作后面插入一个LoadStore屏障 StoreStore屏障可以保证在volatile写之前,其前面的所有普通写操作都已经刷新到主内存中;

激光加工学习笔记

核能气质少年 提交于 2019-11-26 17:50:40
一、储备知识 1. 光子   光具有能量、动量和质量,粒子属性(能量、动量、质量等)和波动属性(频率、波矢、偏振等)体现了波粒二象性 2.能级   物质是由原子组成,而原子又是由原子核及电子构成。电子围绕着原子核运动。而电子在原子中的能量不是任意的。描述微观世界的量子力学告诉我们,这些电子会处于一些固定的“能级”,不同的能级对应于不同的电子能量,离原子核越远的轨道能量越高。此外,不同轨道可最多容纳的电子数目也不同,例如最低的轨道(也是最近原子核的轨道)最多只可容纳2个电子,较高的轨道上则可容纳8个电子等等。 3.跃迁   电子可以通过吸收或释放能量从一个能级跃迁到另一个能级。例如当电子吸收了一个光子时,它便可能从一个较低的能级跃迁至一个较高的能级。同样地,一个位于高能级的电子也会通过发射一个光子而跃迁至较低的能级。在这些过程中,电子释放或吸收的光子能量总是与这两能级的能量差相等。由于光子能量决定了光的波长,因此,吸收或释放的光具有固定的颜色。 4.自发辐射   指高能级的电子在没有外界作用下自发地迁移至低能级,并在跃迁时产生光(电磁波)辐射,辐射光子能量为hv=E2-E1,即两个能级之间的能量差。 这种辐射的特点是每一个电子的跃迁是自发的、独立进行的,其过程全无外界的影响,彼此之间也没有关系。因此它们发出的光子的状态是各不相同的。这样的光相干性差,方向散乱。 5.受激吸收  

090819流水账

大憨熊 提交于 2019-11-26 17:20:57
今天上午给传感器接了3.3V的输入,输出0.9V左右,,看起来是随着给的电压的变化而变化了。所以前辈告诉我先写程序。后来领导又来问了问进度,然后看了看我这个传感器的资料(没有数据手册,只有淘宝链接,淘宝客服也有些让人生气)。得出来的结论是先写程序。 其实我这块板子的程序只写了那么冰山的一角角,还有很多都不会,也不太清楚接下来的程序还应该是什么框架。所以我先跟着正点原子的视频学习了NVIC,之前跟着正点原子的视频学习的时候学习的都很清晰通透,今天学习NVIC就感觉迷迷糊糊的。而且迷糊的地方听好几遍也还不够清晰,自我感觉应该去看看开发指南和参考手册。 来源: https://www.cnblogs.com/Jane-share/p/11328940.html

JUC之原子类

时光总嘲笑我的痴心妄想 提交于 2019-11-26 10:20:57
JUC原子类 文章目录 JUC原子类 一、分类 二、基本类型 1、AtomicInteger 2、AtomicLong 3、AtomicBoolean 三、数组类型 1、AtomicIntegerArray 四、引用类型 1、AtomicReference 2、AtomicReferenceArray 五、对象属性类型 1、AtomicIntegerFieldUpdater(抽象类) demo 一、分类 Juc原子类可以分为以下四大类: 基本类型 AtomicInteger, AtomicLong, AtomicBoolean 数组类型 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray 引用类型 AtomicReference, AtomicStampedRerence, AtomicMarkableReference 对象属性类型 AtomicIntegerFieldUpdater, AtomicLongFieldUpdater, AtomicReferenceFieldUpdater 二、基本类型 1、AtomicInteger public class AtomicInteger extends Number implements java . io . Serializable { private