JAVA 并发编程随笔【六】线程的竞态条件与临界区
2017-09-03 12:23
387 查看
一、竞态条件与临界区在多个线程访问的时候并不会发生,发生在同时对同一个变量、数组、对象做修改的时候;
二、我们来做一个实验,定义一个计数器类,多个线程共同访问计数器的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
二、我们来做一个实验,定义一个计数器类,多个线程共同访问计数器的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
相关文章推荐
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- JAVA 并发编程随笔【六】线程的竞态条件与临界区