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

以上结果就说明当多个线程访问同一个资源时,如果对资源访问的顺序敏感,就存在竞态条件,导致竞态条件发生的代码区称为临界区。

原创粉丝点击