欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java 多线程

程序员文章站 2022-07-05 14:47:24
...

一.房子相当于进程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