Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问同一变量的各种java线程_Java_Linux_Multithreading_Shared Memory - Fatal编程技术网

访问同一变量的各种java线程

访问同一变量的各种java线程,java,linux,multithreading,shared-memory,Java,Linux,Multithreading,Shared Memory,如果我有10个左右的线程访问同一个变量(只读取,不写入),java会允许这些线程同时读取变量,还是每个线程都会排队读取 我对标准行为感兴趣,即访问变量时没有特别注意 该程序正在Linux RedHat上运行。如果不使用同步而允许,多个线程可以读取相同的值。虽然如果不更改该值,但请确保所有10个线程在长时间读取之前都看到了最新的值(可能是初始值)(这需要至少同步一次)。是的,读取和写入将同时完成,要获得更高的一致性,应将volatile关键字添加到变量中。它仍然没有锁,但如果将来你想做一些更一致的

如果我有10个左右的线程访问同一个变量(只读取,不写入),java会允许这些线程同时读取变量,还是每个线程都会排队读取

我对标准行为感兴趣,即访问变量时没有特别注意


该程序正在Linux RedHat上运行。

如果不使用同步而允许,多个线程可以读取相同的值。虽然如果不更改该值,但请确保所有10个线程在长时间读取之前都看到了最新的值(可能是初始值)(这需要至少同步一次)。

是的,读取和写入将同时完成,要获得更高的一致性,应将
volatile
关键字添加到变量中。它仍然没有锁,但如果将来你想做一些更一致的写操作。

理想情况下,它会同时读取,但在某些情况下并不安全

比如说,, 如果您声明:

int i = 1;

Thread threadOne = new Thread() {
public void run() {
    i++;
    System.out.println("ThreadOne is " + i);
}
};

Thread threadTwo = new Thread() {
public void run() {
    i++;
    System.out.println("ThreadTwo is "+ i);
}
};

Thread threadThree = new Thread() {
public void run() {
    i++;
    System.out.println("ThreadThree is " + i);
}
};

threadOne.start();
threadTwo.start();
threadThree.start();
你可以尝试几次,你会看到结果的变化。 如果没有同步,所有线程将“随机”或“同时”读写内存,这取决于谁先完成

运行程序多次后得到的结果:

ThreadOne is 1
ThreadThree is 3
ThreadTwo is 2

ThreadOne is 3
ThreadThree is 3
ThreadTwo is 3

ThreadTwo is 2
ThreadThree is 3
ThreadOne is 2
我们可以看到,所有三个线程都随机读取包含int i的内存,并通过添加一个来更新int a。如果一个线程添加了一个,那么另一个线程将读取2

system.out.println()也是一个进程。在第二次尝试中,它将打印所有3。
这意味着在三个线程读取int i并加1之后,int i的最终结果变成了3。然后system.out.println将全部打印3。这里有另一种方法来证明,在所有这些线程中,所有进程都在同时运行,或者线程在同时运行。

它们将同时读取。据我所知,有些线程甚至可能会缓存它。如果没有同步或其他锁定机制,应该可以同时访问。对于挥发物也是如此,但在这里,访问主堆内存会产生额外的成本。没有读取队列。读访问是为运行线程而模拟的,即使该字段是易变的(前提是没有写)。很好的示例,我们可以有更多的工作要做。尝试在每个i++之前使用不同的时间参数设置sleep(),我想你会得到更有趣的结果。如果示例显示的情况更像@filippo所要求的,那么可能会有所帮助,在这段时间内,你只进行读取而不进行写入。@NESPowerGlove我认为i++同时包含读取和写入,我会更新我的答案。确实如此,我想在这句话的最后一部分描述一下@filippo所要求的情况,他想知道在没有写,只有读的情况下会发生什么。