九、curator recipes之不可重入锁InterProcessSemaphoreMutex
简介
recipes的InterProcessSemaphoreMutex是一种不可重入的互斥锁,也就意味着即使是同一个线程也无法在持有锁的情况下再次获得锁,所以需要注意,不可重入的锁很容易在一些情况导致死锁,比如你写了一个递归。
官方文档:http://curator.apache.org/curator-recipes/shared-lock.html
javaDoc:http://curator.apache.org/curator-recipes/shared-lock.html
代码示例
import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.framework.recipes.locks.InterProcessSemaphoreMutex; import org.apache.curator.retry.ExponentialBackoffRetry; public class SemaphoreMutexDemo { private static CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", new ExponentialBackoffRetry(3000, 3)); private static String path = "/locks/semaphore/0001"; static { client.start(); } public static void main(String[] args) throws Exception { startThread0(); Thread.sleep(10); startThread1(); Thread.sleep(50000); client.close(); } private static void startThread0() { new Thread(() -> { InterProcessSemaphoreMutex lock = new InterProcessSemaphoreMutex(client, path); try { System.out.println("thread0 acquiring"); lock.acquire(); System.out.println("thread0 acquired"); System.out.println("thread0 sleep for 3s"); Thread.sleep(3000); } catch (Exception e) { e.printStackTrace(); } finally { try { lock.release(); System.out.println("thread0 release"); } catch (Exception e) { e.printStackTrace(); } } }).start(); } private static void startThread1() { new Thread(() -> { InterProcessSemaphoreMutex lock = new InterProcessSemaphoreMutex(client, path); try { System.out.println("thread1 acquiring"); lock.acquire(); System.out.println("thread1 acquired"); System.out.println("thread1 sleep for 3s"); Thread.sleep(3000); } catch (Exception e) { e.printStackTrace(); } finally { try { lock.release(); System.out.println("thread1 release"); } catch (Exception e) { e.printStackTrace(); } } }).start(); } }