线程间的同步方式
线程间的同步方式
各个线程可以访问进程中的公共变量和资源,所以使用多线程的过程中需要注意的问题是如何防止两个或两个以上的线程同时访问同一个数据,以免破坏数据的完整性。数据之间的相互制约包括直接制约关系和间接制约关系。
- 直接制约关系:一个线程的处理结果,为另一个线程的输入,因此线程之间直接制约着,这种关系可以称之为同步关系。
比如,房地产开发商把房子建好之后,才能够购买入住。这种是前后顺序关系,必须要保证的。 - 间接制约关系:两个线程需要访问同一资源,该资源在同一时刻只能被一个线程访问,这种关系称之为线程间对资源的互斥访问,某种意义上说互斥是一种制约关系更小的同步。
比如,几个人同时抢上厕所,一个人用完另一个才能使用,这种情况就是间接制约关系。
线程间的同步方式有四种:
- 临界区
临界区对应着一个CriticalSection对象,当线程需要访问保护数据时,调用EnterCriticalSection函数;当对保护数据的操作完成之后,调用LeaveCriticalSection函数释放对临界区对象的拥有权,以使另一个线程可以夺取临界区对象并访问受保护的数据。 - 互斥量
互斥与临界区很相似,但是使用时相对复杂一些,不仅可以在同一应用程序的线程间实现同步,还可以在不同的进程间实现同步,从而实现资源的安全共享。 - 信号量
信号量的用法和互斥的用法很相似,不同的是它可以同一时刻允许多个线程访问同一个资源。 - 事件
事件分为手动置位事件和自动置位事件。事件Event内部包含一个使用计数(所有内核对象都有),一个布尔值表示是手动置位事件还是自动置位事件,另一个布尔值用来表示事件有无触发。由SetEvent()来触发,由ResetEvent()来设成未触发。
在java中线程同步实现:
参考:http://www.cnblogs.com/XHJT/p/3897440.html
还没有评论,来说两句吧...