所以我正在阅读这本名为Java Concurrency in Practice的书,我坚持这个解释,如果没有一个例子,我似乎无法理解.这是引用:
当线程
A写入volatile变量并且随后线程B读取同一个变量时,在读取volatile变量A之前,在写入volatile变量之前可见的所有变量的值都 变为可见B.
有人可以给我一个反例,说明为什么"在读取volatile变量之后A,写入volatile变量之前可见的所有变量的值变得可见B"?
我很困惑为什么B在读取volatile变量之前所有其他非易失性变量都不可见?
我在各种地方(论坛等)看到这个参数,它有助于高度并发的服务器.尽管如此,我还是找不到太阳的官方文件来解释它的作用.它是在Java 6中添加还是在Java 5中存在?
(BTW,许多热点VM参数的好地方是这个页面)
更新: Java 5无法使用此参数启动.
在JLS的第17章中,它引入了一个概念:发生在一致之前.
如果对于A中的所有读取r,其中W(r)是r看到的写入动作,那么一组动作A发生 - 在一致之前,不是hb(r,W(r))或那里的情况在A中存在写w,使得wv = rv和hb(W(r),w)和hb(w,r)"
在我的理解中,它等于以下几个词:...,既不是......也不是......
所以我的前两个问题是:
它还给出了一个例子:17.4.5-1
Thread 1 Thread 2
B = 1; A = 2;
r2 = A; r1 = B;
Run Code Online (Sandbox Code Playgroud)
在第一个执行顺序中:
1: B = 1;
3: A = 2;
2: r2 = A; // sees initial write of 0
4: r1 = B; // sees initial write of 0
Run Code Online (Sandbox Code Playgroud)
订单本身已经告诉我们两个线程交替执行,所以我的第三个问题是:左数是什么意思?
在我的理解中,r2和r1的原因可以看出0的初始写入是A和B都不是volatile字段.所以我的第四个问题是:我的理解是否正确?
在第二个执行顺序中:
1: r2 = A; // sees write of A = 2
3: r1 = B; // sees …Run Code Online (Sandbox Code Playgroud) 我正在寻找重新排序代码的事情,甚至可能在多处理器的情况下破坏代码.
我经常碰到“线程安全”这两个关键术语,想知道这意味着什么。例如,在Firebase或Realm中,某些对象被视为“线程安全”。线程安全的东西到底意味着什么?
我正在实现一个'序列锁'类,以允许锁定写入和无锁读取数据结构.
包含数据的结构包含序列值,在写入发生时,该值将递增两次.在写作开始之前,写作完成之后一次.作者在读者之外的其他线程上.
这是包含数据副本的结构,序列值如下所示:
template<typename T>
struct seq_data_t
{
seq_data_t() : seq(0) {};
int seq; <- should this be 'volatile int seq;'?
T data;
};
Run Code Online (Sandbox Code Playgroud)
整个序列锁定类在循环缓冲区中保存此结构的N个副本.编写器线程总是在循环缓冲区中写入最旧的数据副本,然后将其标记为当前副本.写作是互斥锁定的.
读取功能不会锁定.它试图读取数据的"当前"副本.它在读取之前存储'seq'值.然后它读取数据.然后它再次读取seq值,并将其与第一次读取的值进行比较.如果seq值没有改变,则认为读取是好的.
由于写入线程可以在读取发生时更改"seq"的值,因此我认为seq变量应该标记为volatile,以便read函数在读取数据后将显式读取该值.
read函数如下所示:它将在除writer之外的线程上,也许还有几个线程.
void read(std::function<void(T*)>read_function)
{
for (;;)
{
seq_data_type<T>* d = _data.current; // get current copy
int seq1 = d->seq; // store starting seq no
if (seq1 % 2) // if odd, being modified...
continue; // loop back
read_function(&d->data); // call the passed in read function
// passing it our data.
//??????? could this …Run Code Online (Sandbox Code Playgroud) java ×3
concurrency ×2
volatile ×2
c++ ×1
ios ×1
jvm ×1
memory-model ×1
optimization ×1
processor ×1
swift ×1