线程启动与可见性
package BuildPattern.FactoryPattern.ThreadStartVisibility;
import BuildPattern.FactoryPattern.Tools.Tools;
public class ThreadStartVisibility {
//线程间的共享变量
static int data = 0;
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new Runnable() {
public void run() {
try {
//使当前线程休眠100毫秒,模拟业务消耗的时间
Tools.randomPause(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(data);
}
});
//在子线程thread启动前更新变量data的值
data=1;
thread.start();
Tools.randomPause(100);
//在子线程thread启动后更新变量data的值
data=2;
}
}
结果 有可能是1 也有可能是2
个人理解的原因
main线程是thread的父线程,假如data=2这行代码注释掉,只会输出1也不会输出0,因为父线程在子线程启动前对共享变量的更新对子线程的可见性是有保证的。上述的问题 是因为 父线程在子线程启动后,对共享变量的更新对子线程的可见性是没有保证的。
线程终止与可见性
package BuildPattern.FactoryPattern.Thread;
import BuildPattern.FactoryPattern.Tools.Tools;
public class ThreadJoinVisibility {
//线程间的共享变量
static int data = 0;
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new Runnable() {
public void run() {
try {
//使当前线程休眠100毫秒
Tools.randomPause(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
//更新data
data=1;
}
});
thread.start();
thread.join();
System.out.println(data);
}
}
结果是1
thread运行时将共享变量data的值更新为1,因此main线程对thread线程的join方法调用结束后,该线程读取到的共享变量data值为1,这一点是有保证的。