相关疑难解决方法(0)

Java中的易失性变量

所以我正在阅读这本名为Java Concurrency in Practice的书,我坚持这个解释,如果没有一个例子,我似乎无法理解.这是引用:

当线程A写入volatile变量并且随后线程B 读取同一个变量时,在读取volatile变量A之前,在写入volatile变量之前可见的所有变量的值都 变为可见B.

有人可以给我一个反例,说明为什么"在读取volatile变量之后A,写入volatile变量之前可见的所有变量的值变得可见B"?

我很困惑为什么B在读取volatile变量之前所有其他非易失性变量都不可见?

java concurrency multithreading volatile

20
推荐指数
3
解决办法
1万
查看次数

什么是Java的-XX:+ UseMembar参数

我在各种地方(论坛等)看到这个参数,它有助于高度并发的服务器.尽管如此,我还是找不到太阳的官方文件来解释它的作用.它是在Java 6中添加还是在Java 5中存在?

(BTW,许多热点VM参数的好地方是这个页面)

更新: Java 5无法使用此参数启动.

java concurrency jvm jvm-arguments

12
推荐指数
2
解决办法
8252
查看次数

如何理解发生 - 在一致之前

JLS的第17章中,它引入了一个概念:发生在一致之前.

如果对于A中的所有读取r,其中W(r)是r看到的写入动作,那么一组动作A发生 - 在一致之前,不是hb(r,W(r))或那里的情况在A中存在写w,使得wv = rv和hb(W(r),w)和hb(w,r)"

在我的理解中,它等于以下几个词:...,既不是......也不是......

所以我的前两个问题是:

  • 我的理解对吗?
  • "wv = rv"是什么意思?

它还给出了一个例子: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)

java memory-model

11
推荐指数
2
解决办法
4350
查看次数

处理器优化代码的一些技巧是什么?

我正在寻找重新排序代码的事情,甚至可能在多处理器的情况下破坏代码.

language-agnostic optimization processor

8
推荐指数
2
解决办法
1092
查看次数

在iOS中线程安全是什么意思?

我经常碰到“线程安全”这两个关键术语,想知道这意味着什么。例如,在Firebase或Realm中,某些对象被视为“线程安全”。线程安全的东西到底意味着什么?

thread-safety ios swift

7
推荐指数
3
解决办法
1766
查看次数

这里需要挥发性

我正在实现一个'序列锁'类,以允许锁定写入和无锁读取数据结构.

包含数据的结构包含序列值,在写入发生时,该值将递增两次.在写作开始之前,写作完成之后一次.作者在读者之外的其他线程上.

这是包含数据副本的结构,序列值如下所示:

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)

c++ multithreading volatile

4
推荐指数
1
解决办法
169
查看次数