volatile

Does volatile prevent introduced reads or writes?

左心房为你撑大大i 提交于 2019-12-14 00:21:50
问题 In C#, volatile keyword ensures that reads and writes have acquire and release semantics, respectively. However, does it say anything about introduced reads or writes? For instance: volatile Thing something; volatile int aNumber; void Method() { // Are these lines... var local = something; if (local != null) local.DoThings(); // ...guaranteed not to be transformed into these by compiler, jitter or processor? if (something != null) something.DoThings(); // <-- Second read! // Are these lines..

Java并发之volatile关键字

筅森魡賤 提交于 2019-12-13 23:49:49
引言 说到多线程,我觉得我们最重要的是要理解一个临界区概念。 举个例子,一个班上1个女孩子(临界区),49个男孩子(线程),男孩子的目标就是这一个女孩子,就是会有竞争关系(线程安全问题)。推广到实际场景,例如对一个数相加或者相减等等情形,因为操作对象就只有一个,在多线程环境下,就会产生线程安全问题。理解临界区概念,我们对多线程问题可以有一个好意识。 Jav内存模型(JMM) 谈到多线程就应该了解一下Java内存模型(JMM)的抽象示意图.下图: 线程A和线程B执行的是时候,会去读取共享变量(临界区),然后各自拷贝一份回到自己的本地内存,执行后续操作。 JMM模型是一种规范,就像Java的接口一样。JMM会涉及到三个问题:原子性,可见性,有序性。 所谓原子性。就是说一个线程的执行会不会被其他线程影响的。他是不可中断的。举个例子: int i=1 这个语句在Jmm中就是原子性的。无论是一个线程执行还是多个线程执行这个语句,读出来的i就是等于1。那什么是非原子性呢,按道理如果Java的代码都是原子性,应该就不会有线程问题了啊。其实JMM这是规定某些语句是原子性罢了。举个非原子性例子: i ++; 这个操作就不是原子性的了。因为他就是包含了三个操作:第一读取i的值,第二将i加上1,第三将结果赋值回来给i,更新i的值。 所谓可见性。可见性表示如果一个值在线程A修改了

Is there any need to add volatile keyword to guarantee thread-safe singleton class in java?

扶醉桌前 提交于 2019-12-13 21:16:06
问题 According to this post, the thread-safe singleton class should look as below. But I'm wondering whether there's a need to add volatile keyword to static CrunchifySingleton instance variable. Since if the instance is created and stored in CPU cache, at which time it is not written back to main memory, meanwhile, another thread invoke on getInstance() method. Will it incur an inconsistency problem? public class CrunchifySingleton { private static CrunchifySingleton instance = null; protected

jni/java: thread safe publishing/sharing of effectively immutable native object

倖福魔咒の 提交于 2019-12-13 19:18:22
问题 1) I have a native java function which passes several params and its implementation is a native C++ constructor to create an object and returns a long which is cast from the pointer to object. This object's constructed members are effectively immutable. The C++ object then can do work based on its constructed state. 2) java code that gets the result of the function call safely publishes the longified version of the pointer somewhere (without mutex) and changes a volatile variable to hopefully

Happens before between threads and atomic variable

你离开我真会死。 提交于 2019-12-13 16:07:32
问题 Suppose an AtomicInteger, c , is shared between two threads, thread1 and thread2. Thread1 sets (one time only) a volatile variable t1 using c.incrementAndGet() . Thread2 sets (one time only) a volatile variable t2 using c.incrementAndGet() . Once t1 and t2 are set they are not set again by any other thread. Suppose that after thread1 sets t1 , it checks the value of t2 and gets null . Is it guaranteed that t2 is subsequently set to a higher value then t1 ? (and visa versa). In other words are

Is accessing registers through predefined static addresses undefined behaviour in C++?

不羁岁月 提交于 2019-12-13 14:29:36
问题 I'm compiling a C++ program to run in a freestanding environment and the CPU I'm running on defines a 32-bit peripheral register to be available ( edit: memory-mapped ) at PERIPH_ADDRESS (aligned correctly, and not overlapping with any other C++ object, stack etc.). I compile the following code with PERIPH_ADDRESS predefined, later link it with a full program and run it. #include <cstdint> struct Peripheral { const volatile uint32_t REG; }; static Peripheral* const p = reinterpret_cast

PyTorch中Variable变量

半腔热情 提交于 2019-12-13 13:36:56
一、了解Variable 顾名思义,Variable就是 变量 的意思。实质上也就是可以变化的量,区别于int变量,它是一种可以变化的变量,这正好就符合了反向传播,参数更新的属性。 具体来说,在pytorch中的Variable就是一个存放会变化值的地理位置,里面的值会不停发生片花,就像一个装鸡蛋的篮子,鸡蛋数会不断发生变化。那谁是里面的鸡蛋呢,自然就是pytorch中的tensor了。(也就是说, pytorch都是有tensor计算的,而tensor里面的参数都是Variable的形式 )。如果用Variable计算的话,那返回的也是一个同类型的Variable。 【tensor 是一个多维矩阵】 用一个例子说明,Variable的定义: import torch from torch.autograd import Variable # torch 中 Variable 模块 tensor = torch.FloatTensor([[1,2],[3,4]]) # 把鸡蛋放到篮子里, requires_grad是参不参与误差反向传播, 要不要计算梯度 variable = Variable(tensor, requires_grad=True) print(tensor) “”" 1 2 3 4 [torch.FloatTensor of size 2x2] “”" print

C语言中volatile关键字的使用

こ雲淡風輕ζ 提交于 2019-12-13 12:56:44
volatile是一个类型修饰符(type specifier),就像我们熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量;volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。 volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。 作用 编辑 简单地说就是防止编译器对代码进行优化。比如如下程序: 1XBYTE[2]=0x55; 2XBYTE[2]=0x56; 3XBYTE[2]=0x57; 4XBYTE[2]=0x58; 对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。如果键入volatile,则编译器会逐一地进行编译并产生相应的机器代码(产生四条代码)。 例子 编辑 精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1)并行设备的硬件寄存器(如:状态寄存器) 2)一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 3)多线程应用中被几个任务共享的变量 这是区分C程序员和嵌入式系统程序员的最基本的问题

JAVA专业术语面试100问

﹥>﹥吖頭↗ 提交于 2019-12-13 10:48:29
前言: 面试技巧另外开篇再说,先上面试干货吧。 Redis、 消息队列、 SQL 不要走开,关注后更精彩! 1、面向对象的特点有哪些? 抽象、继承、封装、多态。 2、接口和抽象类有什么联系和区别? 3、重载和重写有什么区别? 4、java有哪些基本数据类型? 5、数组有没有length()方法?String有没有length()方法? 数组没有length()方法,它有length属性。 String有length()方法。 集合求长度用size()方法。 6、Java支持的数据类型有哪些?什么是自动拆装箱? 7、int 和 Integer 有什么区别? 8、Java类的实例化顺序? 父类静态成员和静态代码块 -> 子类静态成员和静态代码块 -> 父类非静态成员和非静态代码块 -> 父类构造方法 -> 子类非静态成员和非静态代码块 -> 子类构造方法 9、什么是值传递和引用传递? 10、String能被继承吗?为什么? 11、String和StringBuilder、StringBuffer的区别? StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况(是线程不安全的) StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况(一般很少)(是线程安全的) 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder >

Java 并发编程(面试篇)

此生再无相见时 提交于 2019-12-13 10:45:31
请谈谈你对 volatile 的理解 volatile 是 Java 虚拟机提供的轻量级的同步机制 保证可见性 禁止指令排序 不保证原子性 JMM(Java 内存模型) 你谈谈 基本概念 JMM 本身是一种抽象的概念并不是真实存在,它描述的是一组规定或则规范,通过这组规范定义了程序中的访问方式。 JMM 同步规定 线程解锁前,必须把共享变量的值刷新回主内存 线程加锁前,必须读取主内存的最新值到自己的工作内存 加锁解锁是同一把锁 由于 JVM 运行程序的实体是线程,而每个线程创建时 JVM 都会为其创建一个工作内存,工作内存是每个线程的私有数据区域,而 Java 内存模型中规定所有变量的储存在主内存,主内存是共享内存区域,所有的线程都可以访问,但线程对变量的操作(读取赋值等)必须都工作内存进行看。 首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,工作内存中存储着主内存中的变量副本拷贝,前面说过,工作内存是每个线程的私有数据区域,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成。 内存模型图 三大特性 可见性 123456789101112131415161718192021222324252627282930313233 /** * @Author: cuzz * @Date: