java双线程调用同一个对象+锁
2015-11-08 22:13
330 查看
两个线程(Thread)调用同一个对象(使用Runnable接口的对象ThreadJob)
误区:下一个线程会从上一个线程结束的地方开始
正解:如
View Code
i = balance;
balane = i + 1
当A线程在i = balance停下来sleep(),假如i被赋值为5
B线程让i被赋值为5,接着把balance改成6
继续改成7
当A线程醒来,继续刚才i=5,接着balance被改成6
//出现覆盖
因此,解决办法:锁(synchronized 原子化--不可分割)
对一个方法public synchronized void increment()
能保证A线程即使sleep(),B线程也无法存取该对象,A醒来后继续
误区:下一个线程会从上一个线程结束的地方开始
正解:如
class TestSync implements Runnable{ int balance; public void run{ for(int i = 0; i < 20; i++){ increment(); } } public void increment{ int i = balance; balance = i + 1; } }
View Code
i = balance;
balane = i + 1
当A线程在i = balance停下来sleep(),假如i被赋值为5
B线程让i被赋值为5,接着把balance改成6
继续改成7
当A线程醒来,继续刚才i=5,接着balance被改成6
//出现覆盖
因此,解决办法:锁(synchronized 原子化--不可分割)
对一个方法public synchronized void increment()
能保证A线程即使sleep(),B线程也无法存取该对象,A醒来后继续
相关文章推荐
- java变量的几种类型
- Java系列笔记(1) - Java 类加载与初始化
- Java基础—数组
- Java回调机制解析
- 5种调优Java NIO和NIO.2的方式
- Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收
- 对java中多态的深刻理解
- mybatis+spring配置
- java比较两个对象是否相等的方法
- Java基础知识
- 【菜鸟学Java】3:封装一个分页类PageBean
- spring事务学习(转账案例)(二)
- Java性能调优笔记
- 反射
- Java基础知识
- Struts2+CKEditor实现web编辑器
- Java----再学习-----Java多态、继承、接口
- 枚举特性
- JAVA学习笔记(33-53)
- JAVA学习笔记(1-32)