JAVA i++线程非安全测试1
2015-11-01 18:20
489 查看
1.i++ 线程非安全测试
package com.jdbc.test; import java.util.concurrent.CountDownLatch; public class Main { private int i; public int getI() { return i; } public void setI(int i) { this.i = i; } public void incr(){ i++; } public static void main(String[] args) throws InterruptedException { for(int j=0;j<10;j++){ final Main main=new Main(); final CountDownLatch count = new CountDownLatch(10000); for(int i=0;i<100;i++){ new Thread(new Runnable() { public void run() { // TODO Auto-generated method stub for(int j=0;j<100;j++){ try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } main.incr(); count.countDown(); } } }).start(); } //主线程等待子线程结束 count.await(); System.out.println(main.getI()); } } }
测试10次,几乎都不是10000
2.i++线程非安全原理
i++ 操作分为三步,第一步取i的值,第二步 让i加1 ,第三步更新i的值
如图主线程主有个i ,每个子线程中有一个i的拷备,当主线程i=0是,如果三个子线程同时读取到i的值为0,每个线程各自给i=i+1,然后分别写入主线程,这样三个线程执行后,虽然执行了3次i++ ,不过i的值为1.
3.线程安全做法一 synchronized
4.线程安全做法二 Lock
相关文章推荐
- 使用fat jar和proguard对包含第三方依赖包的java代码进行打包混淆
- spring中AOP3
- Eclipse创建Django项目
- java怎样杀死一个指定线程
- Java记录 -52- 整体看Java Collection类集
- Spring+Mybatis+SpringMVC后台与前台分页展示实例(附工程)
- 反射没有什么神奇之处
- SpringIOC_别名
- spring mvc常用的注解
- JDK所有版本下载链接
- java抽象类和接口
- JAVA IO结构图
- java中的302和sendRedirect的区别
- Spring学习笔记(二)
- Java中的菜单
- java中的垃圾收集与内存分配
- JAVA课程作业05
- SpringIOC_对象的创建方式
- 科赫雪花递归实现
- (转)Permission denied: win7下面eclipse上传本地文件到DFS && 运行M/R程序时出现的同样的错误解决方法