JAVA 并发编程随笔【六】线程的竞态条件与临界区
来源:互联网 发布:奥利奥爆浆油条淘宝 编辑:程序博客网 时间:2024/06/08 16:56
一、竞态条件与临界区在多个线程访问的时候并不会发生,发生在同时对同一个变量、数组、对象做修改的时候;
二、我们来做一个实验,定义一个计数器类,多个线程共同访问计数器的count变量,我们期望输出的结果是1、2、3、4、5,但是实际的结果是什么呢?
计数器类:
package framework.yaomy.thread.model;/** * @Description:TODO * @version 1.0 * @since JDK1.7 * @author yaomingyang * @company xxxxxxxxxxxxxx * @copyright (c) 2017 yaomy Co'Ltd Inc. All rights reserved. * @date 2017年9月3日 上午11:41:37 */public class Counter {protected long count = 0;public long getCount() {return count;}public void setCount(long count) {this.count = this.count + count;} }
线程任务类:
package framework.yaomy.thread.model;/** * @Description:TODO * @version 1.0 * @since JDK1.7 * @author yaomingyang * @company xxxxxxxxxxxxxx * @copyright (c) 2017 yaomy Co'Ltd Inc. All rights reserved. * @date 2017年9月3日 上午10:50:23 */public class UserRunnable implements Runnable{private Counter counter = null;public UserRunnable(Counter counter) {this.counter = counter;}@Overridepublic void run() {System.out.println("线程:"+Thread.currentThread().getName()+",计数器的值是"+counter.getCount());}}
主方法类:
package framework.yaomy.thread.example;import framework.yaomy.thread.model.Counter;import framework.yaomy.thread.model.UserRunnable;/** * @Description:TODO * @version 1.0 * @since JDK1.7 * @author yaomingyang * @company xxxxxxxxxxxxxx * @copyright (c) 2017 yaomy Co'Ltd Inc. All rights reserved. * @date 2017年9月3日 上午10:48:50 */public class ThreadDemo {public static void main(String[] args) {Counter counter = new Counter();for(int i=1;i<6;i++){counter.setCount(1);Thread thread = new Thread(new UserRunnable(counter), "线程"+i);thread.start();}}}
期望执行结果(debug一步一步执行的结果):
线程:线程1,计数器的值是1线程:线程2,计数器的值是2线程:线程3,计数器的值是3线程:线程4,计数器的值是4线程:线程5,计数器的值是5
实际执行结果:
线程:线程1,计数器的值是4线程:线程3,计数器的值是4线程:线程2,计数器的值是4线程:线程4,计数器的值是5线程:线程5,计数器的值是5
以上结果就说明当多个线程访问同一个资源时,如果对资源访问的顺序敏感,就存在竞态条件,导致竞态条件发生的代码区称为临界区。
阅读全文
0 0
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- 并发编程五:竞态条件与临界区
- Java并发系列-6、竞态条件与临界区
- java并发-竞态条件与临界区(3)
- java竞态条件与临界区
- java 并发编程(四)之临界区中使用条件
- 竞态条件与临界区
- 竞态条件与临界区
- 竞态条件与临界区
- 竞态条件与临界区
- 多线程 竞态条件与临界区
- 竞态条件与临界区
- Java并发编程的暗自努力(三)竞态和临界区
- JAVA 并发编程随笔【七】线程安全与共享资源
- Java 并发编程(六)线程池Executors与ThreadPoolExecutor
- 并发编程六:线程安全与共享资源
- Java并发编程随笔
- 六.Java 线程、并发
- SpringMVC 中文乱码解决方案
- Windows下的MySQL安装、MySQL-Front安装
- 数组中的逆序对
- python中matplotlib的颜色及线条控制
- [Leetcode] 385. Mini Parser 解题报告
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- 带修改的莫队算法【JZOJ 4594】【UVa 12345】Dynamic len
- #快速幂#POJ 2991 2011&&luogu 1226 取余运算
- LInux安装ARPACK库
- Internet结构
- python数据存储系列教程——python中mysql数据库操作:连接、增删查改、指令执行
- 2th roma int
- 最长回文子串
- 扩展欧几里得算法