Lock和Synchronizer有什么关系,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
专注于为中小企业提供成都做网站、网站设计服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业福清免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
Synchronizer,它是一个根据自身状态调节线程执行的对象。就是用来协调(多)线程执行的对象。从这个角度讲Java的内置锁就是一种synchronizer,它以互斥的可重入的方式协调/控制线程的执行。
Java的阻塞队列也是一种synchronizser。
再比如:信号量Semaphore、闭锁Latch、关卡Barrier都是不同类型的synchronizer。
信号量
Semaphore可以用来控制同时访问某资源的线程数量。把对这些资源的获取操作包装起来,获取资源前先调用信号量的acquire()申请许可,资源使用使用完毕后通过release()释放许可。对池化资源的管理一般可用信号量完成。
闭锁
英文Latch有门闩的意思,门闩就是用来把门关紧不让出入。在并发编程里也是这个意思,我们用latch这个对象禁止线程的执行,什么时候允许线程通过这个门闩呢?对于CountDownLatch来说,就是计数变为0的时候。对于FutureTask来说就是可以拿到计算结果的时候(当然也可能是计算异常了)。一个应用场景:可以把闭锁当作一个发令枪,它可以让线程等到信号后一起运行。
关卡
Barrier中文就是“障碍物、栅栏”的意思,文绉绉的翻译就是“关卡”。它其实像极了闭锁,与闭锁不同的是:闭锁等待的是事件,而关卡等待的是线程。从API调用的感觉感觉上讲,Barrier是在工作线程正儿八经的工作都执行完毕后(取决于业务场景),调用barrier.await()使工作线程阻塞住,直到所有其它工作线程也都完成个各自的任务并都调用了barrier.await(),这个时候关卡就被冲破。这里等待的条件是有足够的线程调用barrier.await()。而Latch是在工作线程中调用latch.await(),等待闭锁被开启来执行。闭锁是怎样被开启的?它是依靠latch.countDown()到0后被开启的,谁countdown跟哪个线程没什么直接关系。而barrier.await()是需要实实在在的线程阻塞,这就是为什么说barrier等待的是线程,latch等的是信号。
经常使用关卡到场景是,一个任务分成n个子任务后,等待这n个子任务都完成后再做下一步工作。
CyclicBarrier的构造函数接受一个线程数以及一个关卡被突破后要执行的动作。
Exchanger是另一种关卡,用来为两个线程交换数据,当然是以线程安全的方式交换。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。
新闻名称:Lock和Synchronizer有什么关系
当前链接:http://scpingwu.com/article/ippcsi.html