捡拾日记:闭锁、栅栏

来源:互联网 发布:ipad有淘宝卖家版吗 编辑:程序博客网 时间:2024/05/05 20:12

1、在多线程开发过程中,这两个概念使用的挺多的,闭锁CountDownLatch俗称发令枪,用来阻塞一个线程的开始运行,就相当于一个大门,只有当万事都OK的时候大门才开放,然后开始执行下面的结果,并且该大门只会开放一次,两个重要API就是countdown方法,执行一次值减1,await方法就是等于0的时候开始开大门.栅栏其实就是可以开放多次的闭锁,或者说闭锁就是一个只能开放一次的栅栏,主要用于汇总的感觉,比如跑步时以最后一个到达终点的运动员的时间计终时统计时间,5个人跑步,每跑完一个await一次值加1,当为5的时候大门开放,而且可以多次开放

2、闭锁结合线程池使用可以使用在很多地方,比如在查询所有的主键后可能需要for循环进行查库,此时可以用多线程加上闭锁加快速度,开启十个线程,等最后都执行完了,闭锁开放,再进行主线程的功能执行,提高了速度;同样的也可以结合批量处理、多线程、闭锁来实现几十万几百万的数据加快读写速度;另外可以使用在zk实现分布式锁中,分布锁的原理大致就是:

每个jvm实例在持久化节点/zklock下创建临时有序节点,并获取该父节点下所有的子节点(此时不监控不然会产生羊群效应),我们将ascii码值最小的那个做为锁的持久者,比较当前节点的值是不是最小的一个,如果是就获得锁,如果不是,则去查找在子节点集合中上一个位置上的节点,并监听,如果存在该节点则等待,此时可以用闭锁来配合等待,设置值为1,如果监听到此节点则在process方法中进行countdown操作,这样当上一个位置上的节点释放锁了就不存在该节点了,就执行了countdown然后就不用再await了,这就是锁的逻辑,当释放锁的时候就是将对应被锁的节点删除掉并将被锁变量置空即可

原创粉丝点击