好吧,其实在工作中,我没有用过这个,所以你知道的,对于没用过,或者不怎用的东西,总是比较好奇,如此某些人或许就不屑一顾了吧,让我进一步想看看它是因为看了zookeeper的客户端API的使用,百度一下,第一篇就是importNew的博客,那博客写的当然比我好很多,你看看
http://www.importnew.com/15731.html 里面有不少使用的介绍
因为zookeeper客户端和服务端会话的建立是一个异步的过程,它的构造方法会在处理完客户端初始化的工作就返回啦,但是一般来说,这个会话就可能是没有建立好的,所以还是没有可用的会话的,所以上面的代码设置
private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
可以看到CountDownLatch接受一个int类型的参数作为计数器,想要等待几个操作完成就传入几,当我们调用countDown方法的时候,计数器减1,CountDownLatch的await方法会阻塞当前的线程,知道N变成零,我想至于它是怎么变成0的,我们就可以自由发挥啦。上面是等待异步的watch返回会话已经建立的结果,执行countDown,然后线程就解放了。
去Jdk的文档里面看看,开始就是这么一段描述的示例代码,让所有的work各就各位了以后,startSignal.countDown(); ,才让work去工作,真是憋得慌。
CountDownLatch有一个构造方法,一个CountDown方法,两个await方法
await加上了时间,那么过时不候啦
从源码中可以看到,传入的int 是不能为负数的,如果是0,那这么传await是不起作用的。
至于getcount就和它的名字一样,还有就是toString
super.toString() + "[Count = " + sync.getCount() + "]";
感觉这里面最神奇的应该是sync这个内部类啦,好多java的类喜欢这么搞,看来接下来我的智商就抓鸡啦。开头的两个注释也挺有趣,我理解的是用了AQS做了同步控制(希望高手解答),还可以看到继承了AbstractQueuedSynchronized,直白就是抽象队列同步吧,点开来都是看不太懂的东西(值得下回好好学习下)
然后赋值给内部类中sync中的state,其实state是在SQA中定义的,类型是
volatile,这种类型是线程可见,但还是无法保证数据更改读取的。这里主要重写了AbstractQueuedSynchronized的两个方法tryAcquireShared和tryReleaseShared,在AbstractQueuedSynchronized定义的是抛出异常UnsupportedOperationException。这边减去1的时候,用了compareAndSetState.
据说这是一个高效,厉害的原子操作,下回学习下,今天就写到这吧,困!
图片带有微信标志,是因为我先发的微信个人公众号,然后复制过来