在zk上边,会为每个抢占锁的客户端创建一个临时有序节点,当客户端断开连接后,若心跳超时,则zk会删除临时节点;
如下图所示,添加Thread Group和HTTP Request,其中Thread Group有三个重要属性,包括并发线程数,并发多长时间内,一共发几次;HTTP Request配置有path,表示接口访问路径;
如下图添加压测报告
这里用concurrentHashmap存储锁信息,key为当前线程实例,value为LockData实例,存储锁信息,包括所属线程,存储路径,重入次数;
先创建临时有序节点,并返回zk上的存储路径,接着调用internalLockLoop方法获取锁;
先找出所有有序节点中,序号最小的节点,该节点获取锁;其他节点会添加一个watch,监听其上一个节点;
其他非最小序号节点未获得锁,则进入阻塞在synchronized处,以LockInternals的实例变量为锁对象;而只有一个线程获得了同步锁,其中又会释放锁,此时会进入wait等待,而其他线程此时会获得锁,其中又会释放锁进入wait状态,最终所有阻塞的线程都会进入wait状态,当监听机制发现有相关事件产生时,会唤醒所有等待的线程,这些线程继续判断自身是否是最小的序号,如果是则获取到锁,否则继续进入wait状态,当触发监听事件后,再次唤醒;



