在线程安全1中,我介绍了线程同步的意义和一种实现线程同步的方法:volatile。volatile关键字属于原子操作的一种,若对一个关键字使用volatile,很多时候会显得很“浪费”,因为只有在并发访问的情况下才需要“易变”读写,单线程访问时并不需要。在命名空间System.Threading命名 ...
分类:
编程语言 时间:
2018-03-12 22:57:08
阅读次数:
508
我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况。 内存模型 首先我们思考一下一个java线程要向另外一个线程进行通信,应该怎么做,我们再把需求明确一点,一个java线程对一个变量的更新怎么通知到另外一个线程呢?我们知道java当中的实例 ...
分类:
编程语言 时间:
2018-03-11 21:08:22
阅读次数:
211
同步与线程间通信: 通信 通信是指消息在两条线程之间传递。 既然要传递消息,那接收线程 和 发送线程之间必须要有个先后关系,此时就需要用到同步。通信和同步是相辅相成的。 同步 同步是指,控制多条线程之间的执行次序。 通信 通信是指消息在两条线程之间传递。 既然要传递消息,那接收线程 和 发送线程之间 ...
分类:
编程语言 时间:
2018-03-04 12:58:54
阅读次数:
205
1. volatile 关键字与内存可见性 内存可见性(Memory Visibility)是指当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化。 可见性错误是指当读操作与写操作在不同的线程中执行时,我们无法确保执行读操作的线 ...
分类:
编程语言 时间:
2018-03-04 00:26:27
阅读次数:
222
volatile 关键字: 当多个线程进行操作共享数据时,可以保证内存中的数据可见。 相较于 synchronized 是一种较为轻量级的同步策略。 注意: 1. volatile 不具备“互斥性”: 互斥性:多个线程访问时,只能有一个线程可以拿到锁。 2. volatile 不能保证变量的“原子性 ...
分类:
其他好文 时间:
2018-03-03 18:20:43
阅读次数:
143
原子变量: 在 java.util.concurrent.atomic 包下提供了一些原子变量。 1. volatile 保证内存可见性 2. CAS(Compare-And-Swap) 算法保证数据变量的原子性 CAS 算法是硬件对于并发操作的支持 CAS 包含了三个操作数: ①内存值 V ②预估 ...
分类:
其他好文 时间:
2018-03-03 18:09:09
阅读次数:
126
这篇文章深入分析的是 JDK1.6的 ConcurrentHashMap 的实现原理,但在JDK1.8中又改进了 ConcurrentHashMap 的实现,废弃了 segments。虽然是已经被废弃了,但还是有必要去深入理解一下,出现过,就有它的合理性,而且重要的是思想,不 ...
分类:
其他好文 时间:
2018-03-03 12:27:21
阅读次数:
222
原子操作可以理解为: 一个数,很多线程去同时修改它,不加sync同步锁,就可以保证修改结果是正确的 Atomic正是采用了CAS算法,所以可以在多线程环境下安全地操作对象。 volatile是Java的关键字,官方解释:volatile可以保证可见性、顺序性、一致性。 可见性:volatile修饰的 ...
分类:
其他好文 时间:
2018-03-03 10:59:35
阅读次数:
210
深入理解java内存模型(一)——基础 深入理解java内存模型(二)——重排序 深入理解java内存模型(三)——顺序一致性 深入理解java内存模型(四)——volatile 深入理解java内存模型(五)——锁 深入理解java内存模型(六)——final 深入理解java内存模型(七)——总 ...
分类:
编程语言 时间:
2018-03-03 00:41:20
阅读次数:
228
文章转载自: "正确使用 Volatile 变量" Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅 ...
分类:
编程语言 时间:
2018-03-03 00:38:20
阅读次数:
184