當沒有同步塊並且沒有volatile變量時,由一個線程執行的寫入何時對不同線程可見?這裏是一個簡化的快速排序例子:創建和連接線程時的副作用的可見性
int middle = partitionForTheFirstTime(array);
Thread t = new Thread(new Quicksorter(array, 0, middle - 1));
Thread u = new Thread(new Quicksorter(array, middle + 1, array.size - 1));
t.start()
u.start();
t.join();
u.join();
(爲簡單起見,假設兩個「工作線程」不衍生任何額外的線程)
是否與兩個線程加入保證當前線程看到了所有的副作用?
與此相關的,如果我初始分區之前創建的線程會發生什麼?
Quicksorter a = new Quicksorter();
Quicksorter b = new Quicksorter();
Thread t = new Thread(a);
Thread u = new Thread(b);
int middle = partitionForTheFirstTime(array);
a.setParameters(array, 0, middle - 1);
b.setParameters(array, middle + 1, array.size - 1);
t.start()
u.start();
t.join();
u.join();
這兩個線程是否能夠看到由partitionForTheFirstTime()
引起的副作用?換句話說,創建一個線程產生一個發生之前的關係,或者開始一個線程?
創建一個線程對象不會創建一個線程,並且不會做太多工作。它只有當你開始()它創建一個真正的線程。 – 2011-06-07 10:41:39