使用Java编程安全/常规/原子寄存器

时间:2014-09-08 16:33:03

标签: java multithreading concurrency

我的问题涉及多处理器编程的艺术"书。第4章是关于安全/常规/原子寄存器及其实现。

安全多读者单写入器布尔寄存器的实现如下:基于Safe Single-Reader Single-Writer寄存器,被认为是"可用"。

public class SafeBooleanMRSWRegister implements Register<Boolean> {
 boolean[] s_table; // array of safe SRSW registers
 public SafeBooleanMRSWRegister(int capacity) {
    s_table = new boolean[capacity];
 }
 public Boolean read() {
    return s_table[ThreadID.get()];
 }
 public void write(Boolean x) {
    for (int i = 0; i < s_table.length; i++)
       s_table[i] = x;
 }

问题是:

1)这个神秘的单读者单作家在哪里?书中没有实现。

2)为什么我们需要这种基于阵列的MRSW寄存器实现?为什么SRSW通常失败?为什么这个数组保证了一些东西 - 因为我们假设如果两个线程开始写入,它们将因为该循环而分别写入每个SRSW?但在Java中并不能保证。

3)该寄存器被认为是安全的,而且不是常规的。为什么不定期?我们怎样才能看到与之前和正在进行的写作不同的任何值?

4)如果没有读/写调用重叠,安全,常规或原子寄存器应始终返回最后写入的值。但是在本书的代码示例中,这从未实现过,因为在Java中我们需要一个内存屏障来保证这一点。 如果我们使用&#39; volatile&#39;对于寄存器字段的关键字,然后,据我所知,除了long和double之外,它对所有字段类型都是原子的,包括任意用户类型。因此,对于易变的魔法,我们根本不需要这个代码。

可能我只是错过了重点,这些例子不是真正的代码,而是关于硬件如何工作的一些想法?

2 个答案:

答案 0 :(得分:2)

该书的第一部分(包括第四章)主要是理论。当他说“注册”时,他正在谈论一种数学抽象,它或多或少地对应于大多数计算机系统上的内存。该章试图在数学上证明多处理器硬件必须提供的最少保证是什么,以便我们构建可证明正确的多线程软件系统。

术语“安全”,“常规”和“注册”各自具有非常具体的数学含义,在该章中使用它们。意义全部在文中解释。你只需要仔细阅读,也许可以尝试完成一些练习。

不要指望您在第一部分中阅读的所有内容都是您可以用Java实现的内容,并且不要指望第一部分中的任何是您想要使用的内容在一个真正的程序中。第二部分是你开始找到第一部分描述的理论的实际应用的地方。

答案 1 :(得分:0)

  1. 这个神秘的单读者单作家在哪里?书中没有实现。
  2. 将安全SRSW视为基本构建块。它提供了最薄弱的保障。

    1. 为什么我们需要这种基于阵列的MRSW寄存器实现?为什么SRSW通常失败?
    2. 因为当多个读者阅读时,SRSW不提供任何保证。它只是&#34;未定义的行为&#34;。

      1. 此注册被认为是安全的,而不是常规的。为什么不定期?我们怎样才能看到与以前和正在进行的写作不同的任何值?
      2. 考虑写入(true),然后是另一个与read()重叠的write(true)。常规寄存器读取应返回true。安全寄存器可以返回范围中的任何值 - true或false。这就是为什么在常规寄存器构造中,如果该寄存器中已存在相同的值,则不执行写入。

        1. 如果读/写调用没有重叠,则安全,常规或原子寄存器应始终返回最后写入的值。但是在本书的代码示例中,这从未实现过,因为在Java中我们需要一个内存屏障来保证这一点。
        2. 是的,这只是理论。