单纯使用 volatile 关键字是不能保证线程安全的 volatile 只提供了一种弱的同步机制,用来确保将变量的更新操作通知到其他线程 volatile 语义是禁用 CPU 缓存,直接从主内存读、写变量。表现为:更新 volatile 变量时,JMM 会把线程对应的本地内存中的共享变量值刷新到主 ...
分类:
编程语言 时间:
2019-12-17 15:24:13
阅读次数:
137
前言 乍看可见性,不明白它的意思。联想到线程,意思就是一个线程对主内存的修改及时的被另一个线程观察到,即为可见性。 那么既然有可见性,会不会存在不可见性呢? 答案是肯定的,导致线程不可见的原因是什么呢? 有三个原因: (1)线程交叉执行。 (2)重排序结合线程交叉执行。 (3)共享变量更新后的值没有 ...
分类:
编程语言 时间:
2019-12-15 21:41:51
阅读次数:
101
OS ucore lab 7 练习零: 填写已有实验: 练习一:理解内核级信号量的实现和基于内核级信号量的哲学家就餐问题(不需要编码) 完成练习0后,建议大家比较一下(可用kdiff3等文件比较软件)个人完成的lab6和练习0完成后的刚修改的lab7之间的区别,分析了解lab7采用信号量的执行过程。 ...
分类:
其他好文 时间:
2019-12-11 19:38:07
阅读次数:
79
一、概念 是利用锁的机制来实现同步的。 锁机制有如下两种特性: 互斥性:即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机制,这样在同一时间只有一个线程对需同步的代码块(复合操作)进行访问。互斥性我们也往往称为操作的原子性。 可见性:必须确保在锁被释放之前,对共享变量所做的 ...
分类:
其他好文 时间:
2019-11-28 01:24:31
阅读次数:
82
volatile使用场景:线程间共享变量需要使用 volatile 关键字标记,确保线程能够读取到更新后的最新变量值。 volatile关键字的目的是告诉虚拟机: 1.每次访问变量时,总是获取主内存的最新值。 2.每次修改变量后,立刻会写到主内存。 所以volatile解决的是可见性的问题: 1.当 ...
分类:
其他好文 时间:
2019-11-24 17:51:35
阅读次数:
61
累加器: 场景:各种计数问题,这个计算需要在driver端合并。 作用:解决Driver端和Execute端数据共享问题。 如图,需要将Driver端变量备份到Executor端,那么copy到Executor端的变量一定要是Executor级别的变量。那么如何自定义一个累加器呢,如何将累加器数据类 ...
分类:
其他好文 时间:
2019-11-23 22:10:42
阅读次数:
133
多线程编程2.0——锁的相关认识 多线程对于共享变量访问带来的安全性问题 数据结果与预期不一致性的问题 问题描述 一个自增的程序,当两个线程操作时,可能读取的时同一个数据,再将其自增1,最终返回值只增加了1,实际结果应该增加2。 解决方法 增加锁,达到数据安全的目的,不允许读正在被修改的数据,只允许 ...
分类:
编程语言 时间:
2019-11-23 16:13:24
阅读次数:
49
线程通信的方式: 1、共享变量 线程间通信可以通过发送信号,发送信号的一个简单方式是在共享对象的变量里设置信号值。线程A在一个同步块里设置boolean型成员变量hasDataToProcess为true,线程B也在同步代码块里读取hasDataToProcess这个成员变量。这个简单的例子使用了一 ...
分类:
编程语言 时间:
2019-11-22 01:06:15
阅读次数:
77
实现线程范围的共享变量。 JDK提供了ThreadLocal在一个线程内传递同一个对象 方法调用一定是同一个线程执行的 ThreadLocal一定要在finally中清除:因为当前线程执行完后有可能重新放入线程池中 可以把TheadLocal看成是全局Map<Thread,Object>: (1)每 ...
分类:
编程语言 时间:
2019-11-21 12:12:37
阅读次数:
113
上一篇,我们谈了谈如何通过同步来保证共享变量的原子性(一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行),本篇我们来谈一谈如何保证共享变量的可见性(多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值)。我们使用同步的目的不仅是,不希望某个线程在使用对象状态时,另外一个线程在修改状态,这样容易造成混乱;我们还希望某个线程修改了对象状态
分类:
编程语言 时间:
2019-11-10 10:30:39
阅读次数:
95