java多线程内存模型:
可见性
要实现共享变量的可见性,必须保证两点:
1、线程修改后的共享变量能够及时从工作内存刷新到主内存中;
2、其他线程能够及时把共享变量的最新值从主内存更新到自己的工作内存中;
java语言层面的可见性实现方式(不包含jdk1.5后concurrent中包含的的)
* synchronized
* volatile
Synchronized实现可见性
synchronized可以实现互斥锁(同步),从而保证在任何一个时刻只有一个线程在执行锁内部的代码(原子性);
synchronized能够实现
* 原子性(同步锁)
* 内存可见性
JMM关于synchronized的两条规定
* 线程解锁前(退出synchronized代码块),必须把共享变量的最新值刷新到主内存中;
*线程加锁前(进入synchronized代码块)时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值(注意:加锁与解锁需要是同一把锁)
原子性
指令重排序
内存可见性
volatile无法保证原子性
主线程等待 子线程都运行完才结束
使用while(Thread.activeCount() > 1) {
Thread.yield();
}
所有子线程都join()方式:http://blog.csdn.net/nms312/article/details/30115055