一.房子相当于进程Process,本身无法做什么。里面住了很多人,就相当于线程Thread,共享这个房子的资源。但是,厕所一次只能进一个人,进去的人会上锁。厨房只能进去有限的人,会在门口放几把钥匙,进去的人会取一把,出来时再放回去。钥匙取完时,其它人只能在门口等着。
二.jvm的可见性:当一个共享变量在多个线程工作内存中都存在副本时,如果一个线程修改了这个共享变量,其他线程能够看到这个修改后的值,即可见性。
三.jvm的有序性:假如有个共享变量x,线程a执行x=x+1,线程b执行x=x-1。
a的执行顺序:
1 从主存中读取变量x副本到工作内存
2 给x加1
3 将x加1后的值写回主 存
b的执行顺序:
1 从主存中读取变量x副本到工作内存
2 给x减1
3 将x减1后的值写回主存
实际上顺序有可能是这样的:
1:线程a从主存读取x副本到工作内存,工作内存中x值为10
2:线程b从主存读取x副本到工作内存,工作内存中x值为10
3:线程a将工作内存中x加1,工作内存中x值为11
4:线程a将x提交主存中,主存中x为11
5:线程b将工作内存中x值减1,工作内存中x值为9
6:线程b将x提交到中主存中,主存中x为9
synchronized关键字可以保障一个线程计算时,共享变量处于上锁状态:
1 获得同步锁
2 清空工作内存
3 从主存拷贝变量副本到工作内存
4 对这些变量计算
5 将变量从工作内存写回到主存
6 释放锁
olatile关键字,开销比synchronized要小,但是它只能保证可见性,无法保证有序性。volatile会直接操作主存,没有线程对工作内存和主存同步。比较适合直接给共享变量赋值这种操作。
四、多线程还是多进程
http://blog.csdn.net/lishenglong666/article/details/8557215