课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
进程与线程的学习应用是每一位软件编程开发程序员都应该熟练掌握的一个软件编程开发技术之一,而本文我们就通过案例分析来了解一下,Java编程开发为何需要进程同步。
多进程协作下,多个进程共享逻辑空间,可以访问到共享的资源,在并发访问的情况下会出现数据的不一致,所以需要引入同步机制对进程访问做顺序的控制。
Mutex
Mutex又称互斥锁,互斥锁提供一个状态变量、加锁解锁操作、等待队列。进程在进入临界区之前先进行加锁操作,且变更锁的状态表明锁不可用,当其他进程想要进入临界区的时候同样要进行加锁操作,但因锁不可用所以加锁失败,需要等待获得锁的线程释放锁之后才能加锁成功,如此便保证了进程互斥的进入临界区。
等待队列不是必须的,可以使用自旋替代,即当线程获取锁失败的时候进行空转等待锁释放,这有个好处是可以避免两次上下文切换,但是由于空转没有释放CPU,影响其他进程处理任务,所以通常互斥锁都会提供一个等待队列,等待是广泛意义上说的等待,线程可以处于wait状态也可以是block状态。
Semaphore
Semaphore即信号量,信号量是根据资源数量对进程进行状态管理的一种机制,信号量在狭义上可以指这个机制中的整型数,信号量提供一个大于零的整型数和两个操作。两个操作是wait()和signal(),在Dijkstra提出这个概念的时候这两个操作也叫做P操作和V操作。信号量机制的工作原理是初始化一个整数为可以访问的共享资源的数量,当进程需要访问临界资源的时候先进行P操作,表明占据了一个资源,当使用完毕后进行V操作释放资源,P操作会对整数减1,V操作对整数加1,如果该整数为0,那么进程就无法访问资源。
信号量分为两种:
互斥信号量,信号量的值为0或1,也叫二进制信号量
计数信号量,信号量使用一个较大的范围,介于0~n之间
Monitor
Monitor在操作系统中也被译作管程,管程是高级操作。Semaphore和Mutex都是低级操作,为操作系统层面的实现,通常用来构建更高级的同步工具。信号量和互斥锁的使用都比较复杂,使用不当很容易造成错误。管程即是为了解决信号量这种状态和操作分散且由应用程序员控制的问题,管程的思想是将数据、变量、操作封装到一个模块,可以理解为对信号量的操作和数据的封装,避免信号量中PV操作配对错误的情况。管程通过限制同一时刻只能有一个进程(线程)进入管程来达到互斥的目的。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。