当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。在临界区中使用适当的同步就可以避免竞态条件。
界区实现方法有两种,一种是用synchronized,一种是用Lock显式锁实现。
有临界区是为了让更多的其它线程能安全够访问资源。
class Counter { protected long count = 0; public void add(long value) { this.count = this.count + value; } }
观察线程A和B交错执行会发生什么,两个线程分别加了2和3到count变量上,两个线程执行结束后count变量的值应该等于5。然而由于两个线程是交叉执行的,两个线程从内存中读出的初始值都是0。然后各自加了2和3,并分别写回内存。最终的值并不是期望的5,而是最后写回内存的那个线程的值,上面例子中最后写回内存的是线程A,但实际中也可能是线程B。如果没有采用合适的同步机制,线程间的交叉执行情况就无法预料。
add()方法就是一个临界区,它会产生竞态条件。
请您到ITEYE网站看 java小强 原创,谢谢!
http://cuisuqiang.iteye.com/ !
自建博客地址:http://www.javacui.com/ ,内容与ITEYE同步!
相关推荐
线程临界区 临界区 线程临界区 临界区 线程临界区 临界区
临界区的使用实例.临界区的使用实例.临界区的使用实例.临界区的使用实例.临界区的使用实例.临界区的使用实例.
当需要进入临界区时,显示:“进程x请求进入临界区…”,同时向管理进程提出申请; 申请返回,表示进入了临界区。在临界区中等待一段随机时间,并显示:“进程x正在临界区…”; 当时间结束,显示:“进程x退出临界...
操作系统中一个关于临界区互斥的问题,主要是初期的步骤,大家可以看看。
本多线程是使用的临界区:CRITICAL_SECTION 按下按钮,通知线程要写入一串字符(线程执行完需要2s以上),延时20ms后通知线程再写入一串字符,跟第一次写入造成“冲突”,延时20ms后,在两个写都没完成时再通知线程...
Critical(VC2010条件下通过临界区实现多线程同步)
多线程程序设计中,用于实现互斥管理。对Windows临界区,内核事件,互斥量,信号量四种方式进行对比介绍
这是一个临界区类,实现线程同步。借用windowsAPI封装的一个小工具类,便于自己以后编程,这个类是以后的开始
vs2010C++多线程临界区小案例 简单明了,适合初学者,,,
VC++ 使用临界区同步线程 实例 VC++ 使用临界区同步线程 实例 VC++ 使用临界区同步线程 实例
QT4 线程 临界区的使用 代码简洁 能说明QT下线程的使用 方法,代码有注释,易扩展
1、两个进程模拟需要进入临界区的用户进程,当需要进入临界区时,显示:“进程x请求进入临界区…”,同时向管理进程提出申请;在临界区中等待一段随机时间,并显示:“进程x正在临界区…”;当时间结束,显示:...
在同一个进程的多线程同步锁,宜用临界区锁,它比较节约线程上下文切换带来的系统开销。但因临界区工作在用户模式下,所以不能对不同进程中的多线程进行同步。
操作系统实验,实现缓冲区的互斥访问,利用临界区实现
synchronized关键字不属于方法特征签名的一部分,所以可以在覆盖方法的时候加上去。也就是说,在父类的方法声明上可以没有synchronized关键字,而在子类覆盖该方法时加上synchronized关键字。 注意:使用...
文档加Java实现代码,实现临界区资源模拟
当需要进入临界区时,显示:“进程x请求进入临界区…”,同时向管理进程提出申请; 申请返回,表示进入了临界区。在临界区中等待一段随机时间,并显示:“进程x正在临界区…”; 当时间结束,显示:“进程x退出临界...
关于读写者问题的源码,其中,采用的方式是临界区和条件变量相结合。
[并发并行] [线程同步] [pthread和win32的临界区 Critical Section 比较] vs2010
利用局部临界区变量同步三个线程,并封装成类,可创建多个实例,互不影响。