java 多线程

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值