最近又有针对性的学习了java中的多线程,看到了高级同步对象:信号量,倒数闸门,循环屏蔽,对象交换器
虽然有volatile,final,synchronized,lock等可以简单实现,但没有更高层次的抽象,而高级同步对象则可以,下面只是简单总结了一下自己学过的,只是稍微提一下
----------------------------------------------------------
信号量:使用java.util.concurrent.semaphore类,创建对象时要指定资源的可用数,通过acquire方法以阻塞的方式获取许可,而tryacquire方法以非阻塞方式来获取,当需要释放时,使用release方法,同时semaphore类也支持同时获取和释放多个资源的许可,通过acquire法来获取许可是可被打断的,如果不希望被打断可以使用acquireUninterruptibly方法
倒数闸门:使用java.util.concurrent.CountDownLatch类,,CountDownLatch就想当于多个线程等待开启的一个闸门,latch就是闸门的意思,也就是只有在某个线程完成任务之后,,闸门才会打开,等待的线程才能运行,在创建CountDownLatch对象时指定等待完成的任务数目。循环闸门是一次性的,,不能循环使用。
循环屏蔽:循环屏蔽类似于倒数闸门,,使用java.util.concurrent.CyclicBarrier来表示循环屏障,对象在创建时需要指定该对象的线程数目,如果在参与线程中有一个在等待的过程中被中断,出现超时或其他错去,整个循环屏蔽会失效,抛出java.util.concurrent.BrokenBarrierException异常