并发编程三要素 1. 原子性: 一个不可再被分割的颗粒。原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。 2. 有序性: 程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序) 3. 可见性: 一个县城对共享变量的修改,另一个线程能够立刻看到。 一、原子性 线程切换会带来 ...
分类:
其他好文 时间:
2019-09-12 16:47:11
阅读次数:
86
并发的特性1、可见性a、保证任何一个线程修改变量立即写入到主内存中(堆);b、所有线程对该变量引用会强制立即失效,并且该线程必须去堆中获取最新的变量值。2、指令重排序代码的执行顺序会在JVM中(编译器优化指令级并行重排序内存系统重排序最终执行的指令序列)3、原子性同一时刻最多只有一个线程访问该段代码。Volatile->可见性、指令重排序Synchronied->可见性、指令重排序、原
分类:
编程语言 时间:
2019-09-10 00:20:04
阅读次数:
84
目录: 1.重排序场景 2.追根溯源 3.缓存一致性协议 4.重排序原因 一、重排序场景 当两个线程 A 和 B,A 首先执行writer() 方法,随后 B 线程接着执行 reader() 方法。线程B在执行操作4时,能否看到线程 A 在操作1对共享变量 a 的写入? 答案是:不一定能看到。 由于 ...
分类:
编程语言 时间:
2019-09-07 10:25:49
阅读次数:
403
并发编程中,有两个关键问题:线程之间如何通信及线程之间如何同步。 通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种,共享内存和消息传递。 在共享内存的并发模型里,线程之间共享程序的公共状态,通过读写内存中的公共状态进行隐式通信;在消息传递的并发模型李,线程之间没有公共状 ...
分类:
其他好文 时间:
2019-09-06 01:43:18
阅读次数:
129
1.重排序概念 A.cpu会对代码执行顺序实现优化,不会对有依赖关系的数据做重排序。代码的执行顺序可能会发生改变,但是执行的结果不会发生任何改变。 B.as-if-serial:不管怎么去做重排序,目的是提高并行度,但是不能影响到正常的结果。 C.重排序在多线程情况下遇到 2.wait()和noti ...
分类:
编程语言 时间:
2019-09-06 01:14:20
阅读次数:
109
链表重排序 题目描述: 给定链表 Lo一>L1一>L2… Ln 1一>Ln,把链表重新排序为 Lo Ln一>L1一>Ln 1 L2一> Ln 2…。要求:(l)在原来链表的基础上进行排序,即不能申请新的结点;(2)只能修改结点的 next 域,不能修改数据域。 解题思路: 1. 找出链表的中间节点, ...
分类:
编程语言 时间:
2019-09-05 18:59:57
阅读次数:
120
Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhejiang University. Each test is supposed to run sim ...
分类:
编程语言 时间:
2019-08-31 21:30:08
阅读次数:
97
锁的内存语义本质上可以说是对共享变量的更新,能及时让其他线程观察到;并且通过内存屏障,组织编译器或处理器指令重排序,导致多线程下不一致的现象。 1. volatile内存语义 见上一篇文章。 2. 锁的内存语义 (1)锁的释放和获取的内存语义 当线程释放锁时,JMM会将本地内存中的共享变量同步到主内 ...
分类:
其他好文 时间:
2019-08-13 00:52:36
阅读次数:
151
使用双检索的单例设计模式延迟加载存在的问题 这篇文章介绍了使用双检索延迟加载的单例模式存在的问题,以下的代码由于指令重排序可能会无法正常工作。 正常的执行顺序是 但由于指令的乱序执行,代码的执行顺序可能变为 由此,线程可能获取到一个没有初始化完毕的对象。 1 class Foo { 2 privat ...
分类:
编程语言 时间:
2019-08-08 21:42:55
阅读次数:
119
70%的Java程序员不知道为啥 ConcurrentHashMap 读操作不需要加锁?
分类:
编程语言 时间:
2019-08-07 16:15:06
阅读次数:
99