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

时间:2014-04-24 15:15:56

标签: java linux multithreading shared-memory

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

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

该程序在Linux RedHat上运行。

3 个答案:

答案 0 :(得分:2)

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

例如,     如果你宣布:

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()也是一个过程。在第二次尝试中,它打印所有3s。 这意味着在三个线程读取int i并添加1之后,int i的最终结果变为3.然后system.out.println将全部打印3.这是另一种方式来证明,在所有这些线程中,所有进程都是同时运行或线程同时运行。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

是的,读取和写入将同时进行,为了更加一致,您应该将volatile关键字添加到变量中。它仍然没有锁,但如果将来你想做一些更一致的写操作。