多线程
文章平均质量分 79
多线程学习
存在,及合理
记录点点滴滴,汇成山河大海
展开
-
010线程状态图示
线程生命周期不可逆:一旦进入 Runnable 状态就不能回到 New 状态;一旦被终止就不可能再有任何状态的变化。所以一个线程只能有一次 New 和 Terminated 状态,只有处于中间状态才可以相互转换。原创 2023-05-16 10:47:40 · 73 阅读 · 0 评论 -
并发容器-ConcurrentHashMap
如果某一个数据结构声称自己是线程安全的,那么它同样需要保证可见性,也就是说,当一个线程操作这个容器的时候,该操作需要对另外的线程都可见,也就是其他线程都能感知到本次操作。有多个线程同时使用 put 来添加元素,而且恰好两个 put 的 key 是一样的,它们发生了碰撞,也就是根据 hash 值计算出来的 bucket 位置一样,并且两个线程又同时判断该位置是空的,可以写入,所以这两个线程的两个不同的 value 便会添加到数组的同一个位置,这样最终就只会保留一个数据,丢失一个数据。原创 2023-06-24 22:55:44 · 147 阅读 · 0 评论 -
内存屏障(Memory Barriers / Fences)
是一种屏障指令,它使得CPU或编译器对屏障指令的前和后所发出的内存操作执行一个排序的约束。也叫内存栅栏或栅栏指令,volatile实现了Java内存模型中的可见性和有序性,但volatile无法保证原子性。内存屏障之前的所有写操作都要回写到主内存,内存屏障之后的所有读操作都能获得内存屏障之前的所有写操作的最新结果(实现了可见性)。因此重排序时,不允许把内存屏障之后的指令重排序到内存屏障之前。原创 2023-06-23 17:11:57 · 796 阅读 · 0 评论 -
013volatile
写内存语义是直接刷新到主内存中读的内存语义是直接从主内存中读取,然后复制。原创 2023-06-23 19:33:21 · 28 阅读 · 0 评论 -
多线程012 happens-before
在JMM中,如果一个操作执行的结果需要对另一个操作可见性那么这两个操作之间必须存在happens-before关系。原创 2023-06-22 18:53:27 · 24 阅读 · 0 评论 -
011JMM
通过这组规范定义了程序中(尤其是多线程)各个变量的读写访问方式并决定一个线程对共享变量的写入何时以及如何变成对另一个线程可见。JMM(Java内存模型Java Memory Model,简称JMM)本身是一种。以实现让Java程序在各种平台下都能达到一致的内存访问效果。JMM的关键技术点都是围绕多线程的。原子性、可见性和有序性展开的。线程和主内存之间的抽象关系。仅仅描述的是一组约定或规范。1 通过JMM来实现。原创 2023-06-20 23:22:14 · 39 阅读 · 0 评论 -
010并发3大问题 原子性,有序性,可见性
JMM的关键技术点都是围绕多线程的。Java虚拟机规范中试图定义一种Java内存模型(java Memory Model,简称JMM) 来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。,线程对变量的所有操作(读取,赋值等)都必需在线程自己的工作内存中进行,而不能够直接读写主内存中的变量。CPU的运行并不是直接操作内存而是先把内存里边的数据读到缓存,而内存的读和写操作的时候就会造成不一致的问题。,线程自己的工作内存中保存了该线程使用到的变量的。原创 2023-06-21 00:17:13 · 27 阅读 · 0 评论