你以为在java里用synchronized就能万事大吉了吗?
来源:互联网 发布:lol数据查询 编辑:程序博客网 时间:2024/04/29 21:00
我们先来想想,synchronized的功能:
1.同步,搞互斥锁,使线程不能交叉执行;
2.维护共享变量在多个线程之间的可见性;
public class demo {private boolean ready=false;private int result=0;private int number=1;public synchronized void write(){ready=true;number=2;}public synchronized void read(){if(ready){result=number*3;}System.out.println("result的值为:"+result);}public class ReadWriteThread extends Thread{private boolean flag;public ReadWriteThread(boolean flag){this.flag=flag;}public void run(){if(flag)write();else{read();}}}public static void main(String[] args) throws InterruptedException{demo synDemo=new demo();synDemo.new ReadWriteThread(true).start(); //1//Thread.sleep(1000);synDemo.new ReadWriteThread(false).start(); //2}}
大家先别往下看,先猜猜这段程序的输出结果是什么。^-^先别往下看哦亲。
大家可能觉得结果不就是result=6吗?
哈哈,那你就中招了。
我们很容易忽略JMM里的一条规则:
指令重排序。
在这段程序里,编译器可能不会进行重排序,但是也可能进行重排序,主程序中1、2两句进行重排序的话,结果就是0了。
然而,如果你把代码敲出来你就会发现出现0的几率还是很低的。这是因为编译器会揣摩我们的意图,让6尽可能的出现。
下面看宝宝执行了多次程序之后得到的一个0值:
怎样才能避免呢?加个休眠吧。。。
0 0
- 你以为在java里用synchronized就能万事大吉了吗?
- 在VC里装了easyx并不是万事大吉了~
- Effective Java--序列化--你以为只要实现Serializable接口就行了吗
- 你以为你光是那道题选对了,就能好吗?
- 你以为放条“鲶鱼”进去就能激活团队吗?
- 在找C#语言规范吗?只要你装了VS,你就能找到
- 很多我们以为一辈子都不会忘记的事情,就在我们念念不忘的日子里,被我们遗忘了。
- 逃离北上广:你以为回到小城市就很幸福了吗?
- 屌丝,不要以为这样你就可以逆袭了
- 你以为只是下围棋能赢人类?微软的 AI 在吃豆人游戏上也超越人类了
- 安卓手机你以为你删除了文件短信,通讯录你就百事无忧了?
- 别以为用了病毒保护程序就高枕无忧了
- 你以为你看见了?
- (转载)不要以为用了linux就觉得…
- 【写给自己】不要以为跟着打了代码你就会了
- 你以为你能拿多少钱?
- 你以为你以为的就是你以为的吗?
- java Volatile你以为你用对了吗?从原理上告诉你该怎么用!
- 【VMware虚拟化解决方案】VMware私有云的“五步走”
- [win] - PHP5.6 64bit(wamp)配置phpredis,已脱坑
- 在Viewpager的子Activity中startActivityForResult调用其他Activity时候遭遇到onActivityResult方法不响应的问题
- java 多线程下载
- Spring Security3权限控制
- 你以为在java里用synchronized就能万事大吉了吗?
- 构造函数与对象初始化器的异同
- js学习案例:句子中最长的单词,计算其长度
- android端与PC端连接不上的解决方式
- MyBatis常用的转义字符
- 短信推送
- 微信jssdk开发
- AOP设计与实现
- ORA-24816: Expanded non LONG bind data supplied after actual LONG or LOB column