您的位置:首页 > 编程语言 > Java开发

JAVA 并发编程随笔【六】线程的竞态条件与临界区

2017-09-03 12:23 176 查看
一、竞态条件与临界区在多个线程访问的时候并不会发生,发生在同时对同一个变量、数组、对象做修改的时候;

二、我们来做一个实验,定义一个计数器类,多个线程共同访问计数器的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;
}
@Override
public 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


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

4000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: