原子

原子性,有序性,可见性

纵饮孤独 提交于 2020-04-06 01:01:14
synchronized (原子性 有序性 可见性) volatile (原子性 可见性) 1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。 2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。 3.volatile仅能实现变量的修改可见性,并不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。 4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。 5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。 原子性:所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束 例如:int i = 1; 该语句为原子操作,因为执行这句话后i的值一定是等于1. 反例:int i= 0; i++ ; 其中 i++不是原子操作,在多线程中会有线程安全问题,i++其实分为三个步骤,1. 读取变量i的值;2:对i进行加一的操作;3.将计算后的值再赋值给变量i synchronized :能保证原子操作。1、锁住主内存,2、执行工作内 3、将工作内存写入主内存。4.释放锁

并发编程面试题

萝らか妹 提交于 2020-03-27 13:28:29
一.volatile关键字有什么用途,和Synchronize有什么区别 volatile是一个轻量级的Synchronize,保证了共享变量的可见性,能够防止脏读,被volatile关键字修饰的变量,如果值发生了改变,其他线程立刻可见 volatile能保证数据可见性,但是无法保证数据的原子性 Synchronize既能保证数据可见,也能保证数据原子性 场景: 1.volatile关键字不能修饰写入操作依赖于当前的值count++; count+=1; , 不是原子操作,JVM字节码层面不是一部操作 2.volatile可以禁止指令重排,JVM相关的优化没了,效率变低 二.什么是指令重排序 指令重排的分类:编译期重排序和运行时重排序 在JVM编译时期或者CPU执行JVM字节码时期,对现有的指令进行重排序,主要目的为了优化运行速度(在不程序运行结果的前提下) int a = 3 //1 int b = 5; //2 int c = a + b; //3 虽然说指令重排可以调高程序的执行效率,但是在多线程环境下运行可能会影响到结果 解决办法:内存屏障 内存屏障是一个屏障指令,使CPU对屏障指令之前和之后的内存操作结果都是一样的,相当于一种约束 三.先行发生原则Happens-before int k = 1; //男人 int j = k; //女人

原子类案例

泄露秘密 提交于 2020-03-26 16:08:01
java.util.concurrent.atomic包:原子类的小工具包,支持在单个变量上解除锁的线程安全编程 原子变量类相当于一种泛化的 volatile 变量,能够支持原子的和有条件的读-改-写操作。AtomicInteger 表示一个int类型的值,并提供了 get 和 set 方法,这些 Volatile 类型的int变量在读取和写入上有着相同的内存语义。它还提供了一个原子的 compareAndSet 方法(如果该方法成功执行,那么将实现与读取/写入一个 volatile 变量相同的内存效果),以及原子的添加、递增和递减等方法。AtomicInteger 表面上非常像一个扩展的 Counter 类,但在发生竞争的情况下能提供更高的可伸缩性,因为它直接利用了硬件对并发的支持。 如果同一个变量要被多个线程访问,则可以使用该包中的类 AtomicBoolean AtomicInteger AtomicLong AtomicReference 示例: 1.没有使用原子类的代码 private static Integer count=1; private static void getCount(){ System.out.println(count); count++; } public static void main(String[] args) { AtomicTest

《七堂极简物理课》总结

混江龙づ霸主 提交于 2020-03-21 18:37:38
目录 一、 最美理论 1. 1905年 ,爱因斯坦科学期刊《投了三篇文章》 2. 空间是一种物质 3. 爱因斯坦方程式 4. 黑洞 5. 宇宙大爆炸 二、 量子 1. 普朗克假设 2. 量子理论诞生宣言 3. 量子跃迁 4. 量子理论方程 三、 宇宙的构造 人类宇宙构造的认知历史 四、 粒子 原子组成 粒子理论 五、空间的颗粒 20世纪两大明珠 相互矛盾的伟大理论 圈量子引力 六、概率、时间和黑洞的热 1. 热的本质 2. 黑洞的热 七、我们 一、 最美理论 1. 1905年 ,爱因斯坦科学期刊《投了三篇文章》 第一篇指出了原子的存在 第二篇奠定了量子力学的基础 第三篇提出了《狭义相对论》 狭义相对论对牛顿的万有引力提出了质疑,和自由落体的认知产生了矛盾,爱因斯坦花了十年的时间解决,提出了《广义相对论》 牛顿想像物体是在空间中运动的:所有物体都做直线运动,直到一个力使它们的轨道发生弯曲,至于这个容纳世界的空间是由什么做成的,牛顿没有给出答案。 爱因斯坦出生前的几年,法拉第和麦克斯韦发现了“电磁场”:一种无处不在的真实存在,可以传递无线波,可以振动,波动 爱因斯坦收电磁场启发:引力场不弥漫于空间,因为它本身就是空间。 2. 空间是一种物质 广义相对论对宇宙做出了惊人的简化:空间是构成世界的“物质”之一,这种可以波动、弯曲、变形的实体。 太阳会使其周围的空间发生弯曲

原子操作类AtomicInteger详解

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-20 08:08:13
为什么需要AtomicInteger原子操作类? 对于Java中的运算操作,例如自增或自减,若没有进行额外的同步操作,在多线程环境下就是线程不安全的。num++解析为num=num+1,明显,这个操作不具备原子性,多线程并发共享这个变量时必然会出现问题。测试代码如下: public class AtomicIntegerTest { private static final int THREADS_CONUT = 20; public static int count = 0; public static void increase() { count++; } public static void main(String[] args) { Thread[] threads = new Thread[THREADS_CONUT]; for (int i = 0; i < THREADS_CONUT; i++) { threads[i] = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 1000; i++) { increase(); } } }); threads[i].start(); } while (Thread.activeCount() > 1) {

原子操作类AtomicInteger详解

谁说我不能喝 提交于 2020-03-20 08:08:00
为什么需要AtomicInteger原子操作类? 对于Java中的运算操作,例如自增或自减,若没有进行额外的同步操作,在多线程环境下就是线程不安全的。num++解析为num=num+1,明显,这个操作不具备原子性,多线程并发共享这个变量时必然会出现问题。测试代码如下: public class AtomicIntegerTest { private static final int THREADS_CONUT = 20; public static int count = 0; public static void increase() { count++; } public static void main(String[] args) { Thread[] threads = new Thread[THREADS_CONUT]; for (int i = 0; i < THREADS_CONUT; i++) { threads[i] = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 1000; i++) { increase(); } } }); threads[i].start(); } while (Thread.activeCount() > 1) {

β particle, α particle, γ ray, ionization chamber

大憨熊 提交于 2020-03-18 15:40:35
Alpha particles consist of two protons and two neutrons bound together into a particle identical to a helium-4 nucleus. They are generally produced in the process of alpha decay, but may also be produced in other ways. Alpha particles are named after the first letter in the Greek alphabet, α. The symbol for the alpha particle is α or α 2+ . α粒子是带正电的高能粒子, 由两个质子和两个中子组成, 与He-4原子核相同, 通常由一些重原子(例如铀, 镭, 或一些人造核素)衰变时产生. 这种粒子由希腊文的第一个字符α命名, 可以写成α 或 α 2+ . 穿透性较差, 能被一张薄纸阻挡, 在穿过介质后迅速失去能量, 但是在穿入组织(即使是不能深入)也能引起组织的损伤. α粒子通常被人体外层坏死肌肤完全吸收, α粒子释放出的放射性同位素在人体外部不构成危险, 然而一旦被吸入或注入, 将会十分危险. Alpha particles are commonly

原子操作之sync/atomic

好久不见. 提交于 2020-03-17 01:48:48
某厂面试归来,发现自己落伍了!>>> 原子操作之sync/atomic 对于并发操作而言,原子操作是个非常现实的问题。典型的就是i++的问题。 当两个CPU同时对内存中的i进行读取,然后把加一之后的值放入内存中,可能两次i++的结果,这个i只增加了一次。 如何保证多CPU对同一块内存的操作是原子的。 golang中sync/atomic就是做这个使用的。 具体的原子操作在不同的操作系统中实现是不同的。比如在Intel的CPU架构机器上,主要是使用总线锁的方式实现的。 大致的意思就是当一个CPU需要操作一个内存块的时候,向总线发送一个LOCK信号,所有CPU收到这个信号后就不对这个内存块进行操作了。 等待操作的CPU执行完操作后,发送UNLOCK信号,才结束。** 在AMD的CPU架构机器上就是使用MESI一致性协议的方式来保证原子操作。** 所以我们在看atomic源码的时候,我们看到它针对不同的操作系统有不同汇编语言文件。 如果我们善用原子操作,它会比锁更为高效。 CAS 原子操作中最经典的CAS(compare-and-swap)在atomic包中是Compare开头的函数。 func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool) func CompareAndSwapInt64(addr

石墨烯、二硫化钼和黑磷

好久不见. 提交于 2020-03-13 07:51:29
通常情况下,胶带不会被看作是一种具有科学突破性的进展。但是当英国曼彻斯特大学物理学家安德烈·盖姆(Andre Geim)和康斯坦丁·诺沃肖罗夫(Konstantin Novoselov)(两人在2010年获得诺贝尔物理学奖)2004年与同事在《科学》杂志发表了他们的研究成果——即用透明胶带从一块石墨烯上剥落碳原子的单原子薄片,这一研究缓缓拉开了材料学革命的序幕。 自上述曼彻斯特研究团队发表其研究成果的11年来,相关领域的研究成果呈指数增长,去年,全球研究人员发表的关于石墨烯的研究成果超过1.5万项。这种现象很合乎情理:石墨烯是迄今为止制作的最轻材料,它的强度是钢的100倍,比铜的导电性、柔韧性更好,而且很大程度上是透明的。研究人员设想了未来以石墨烯为基础建造的每样产品,如从下一代计算机芯片和柔性显示器到蓄电池和燃料电池。 然而,石墨烯可能不会通过其自身作为一种理想材料来实现未来的巨大影响,而是通过它衍生的产物。尽管石墨烯有着许多令人眼花缭乱的优点,但它也有缺点,尤其是不能充当半导体——这是微电子的基石。现在,化学家和材料学家正在努力越过石墨烯,寻找其他的材料。他们正在合成其他两种兼具柔韧性和透明度,而且拥有石墨烯无法企及的电子特性的二维片状材料,他们已经把其中一些转变为具备轻量性和柔韧性的快速电子和光学设备,他们希望,这些材料可以作为未来产业的支柱。 石墨烯,打开二维材料新视野

mongodb 原子操作findAndModify

雨燕双飞 提交于 2020-03-13 07:33:32
原子操作模型数据findAndModify 推荐的方法,以保持原子将保留所有的相关信息,这些信息经常更新,一个文档中使用嵌入文档。这将确保所有的更新为一个单一文档是原子。 考虑下面的 products 文档: { "_id":1, "product_name": "Samsung S3", "category": "mobiles", "product_total": 5, "product_available": 3, "product_bought_by": [ { "customer": "john", "date": "7-Jan-2014" }, { "customer": "mark", "date": "8-Jan-2014" } ] } 在本文档中,我们已经嵌入客户买该产品的信息在 product_bought_by 字段中。现在,每当新客户购买的产品,我们会先检查该产品是否仍然可以使用 product_available 字段。如果是的话,我们将减少 product_available 字段的值,并在 product_bought_by 字段插入新客户的嵌入文档。此功能将使用 findAndModify 命令,因为它搜索并更新在同一个文档。 >db.products.findAndModify({ query:{_id:2,product_available:{