如果我有10个线程左右访问同一个变量(只读它,不写),java会允许这些同时读取变量还是每个线程都会排队读取?
我对标准行为感兴趣,即没有特别注意访问变量。
该程序在Linux RedHat上运行。
答案 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
关键字添加到变量中。它仍然没有锁,但如果将来你想做一些更一致的写操作。