当没有同步块并且没有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