一:互斥与同步
互斥:一个公共资源同一时刻只能被一个进程或线程使用,多个进程或线程不能同时使用公共资源。
同步:两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序运行。
解决方法:互斥锁,条件变量,读写锁,自旋锁,信号量(互斥与同步)
二:互斥锁(同步)
互斥锁是一种简单的加锁的方法来控制对共享资源的访问,互斥锁只有两种状态,即上锁( lock )和解锁( unlock )。
特点:唯一性,原子性,非繁忙等待
三:条件变量(同步)
条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直 到某特殊情况发生为止。适合多个线程等待某个条件的发生,不使用条件变量,那么每个线程就不断尝试互斥锁并检测条件是否发生,浪费系统资源。
四:读写锁(同步)
三种状态:读模式下加锁状态、写模式加锁状态、不加锁状态
【读写锁的特点】:
如果有其它线程读数据,则允许其它线程执行读操作,但不允许写操作;
如果有其它线程写数据,则其它线程都不允许读、写操作。
【读写锁的规则】:
1:如果某线程申请了读锁,其它线程可以再申请读锁,但不能申请写锁;
2:如果某线程申请了写锁,其它线程不能申请读锁,也不能申请写锁。
读写锁适合于对数据结构的读次数比写次数多得多的情况。
五:自旋锁(同步)#include
线程同步是指,两个或两个以上的线程访问同一资源时,需要线程同步你可以使用下面这个类;
Monitor.Enter(obj);
...
Monitor.Wait(obj);
中间的代码同时只允许一个线程访问,其他线程执行到Monitor.Enter(obj),就会自动挂起,带执行的线程释放排它锁后就允许线程队列的最后一个线程进入执行,同时获得排他锁。其实这和
lock(obj)
{
...
}
所起的效果一样。
一、java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用, 从而保证了该变量的唯一性和准确性。
二、实现方法:
1、同步方法即有synchronized关键字修饰的方法。由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。代码如: public synchronized void save(){}123注:synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类
2、同步代码块即有synchronized关键字修饰的语句块。被该关键字修饰的语句块会自动被加上内置锁,从而实现同步。
3、使用特殊域变量(volatile)实现线程同步
1)volatile关键字为域变量的访问提供了一种免锁机制;
到此,以上就是小编对于的问题就介绍到这了,希望这3点解答对大家有用。
网站名称:c语言windows线程同步
标题链接:http://www.shufengxianlan.com/qtweb/news23/365923.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联