zookeeper實現分佈式鎖

神馬是分佈式鎖呢,就是利用服務器集羣的特性,如zookeeper或者mysql,redis對多臺分佈式服務器的進程進行只容許一臺服務器的一個進程來進行一個同步操做的過程,其餘任務服務器的進程只能等待,進行自旋。mysql

用zookeeper鎖,咱們用到的zookeeper客戶端的一個依賴。redis

<dependency>
   <groupId>org.apache.curator</groupId>
   <artifactId>curator-framework</artifactId>
   <version>2.9.0</version>
</dependency>
<dependency>
   <groupId>org.apache.curator</groupId>
   <artifactId>curator-recipes</artifactId>
   <version>2.9.0</version>
</dependency>
public interface OrderService {
    public String getOrderNo();
}

這裏依然已訂單編號爲例,一個訂單編號的接口。sql

public class OrderLockServiceImpl implements OrderService {
    static int num = 0;
    @Override
    public String getOrderNo() {
        SimpleDateFormat date = new SimpleDateFormat("YYYYMMDDHHMMSS");
        return date.format(new Date()) + num++;
    }
}

實現這個接口,不過這裏跟JVM鎖不一樣,不須要加同步標記,如synchronized或者其餘可重入鎖之類的。apache

public class OrderTask2 implements Runnable{
    private CountDownLatch latch;
    private OrderService orderService;
    private InterProcessLock lock;
    public OrderTask2(CountDownLatch latch,OrderService orderService,InterProcessLock lock) {
        this.latch = latch;
        this.orderService = orderService;
        this.lock = lock;
    }

    @Override
    public void run() {
        try {
            latch.await();
            lock.acquire();
            System.out.printf("類名%s訂單號:%s\n",orderService.getClass().getName(), orderService.getOrderNo());
            lock.release();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

實現一個線程類,InterProcessLock爲zookeeper的分佈式鎖接口。服務器

final static CuratorFramework client = CuratorFrameworkFactory.builder().connectString("XXX.XXX.XXX.XXX:2181,XXX.XXX.XXX.XXX:2181,XXX.XXX.XXX.XXX:2181").retryPolicy(new ExponentialBackoffRetry(100,1)).build();
public static void main(String[] args) {
    client.start();
    ExecutorService service = Executors.newCachedThreadPool();
    InterProcessMutex lock = new InterProcessMutex(client,"/bit");
    final CountDownLatch latch = new CountDownLatch(1);
    for (int i = 0;i < 10;i++) {
        service.submit(new OrderTask2(latch,new OrderLockServiceImpl(),lock));
    }
    latch.countDown();
    service.shutdown();
}

其中"XXX.XXX.XXX.XXX:2181,XXX.XXX.XXX.XXX:2181,XXX.XXX.XXX.XXX:2181"爲zookeeper集羣分佈式

運行結果ide

類名com.guanjian.until.OrderLockServiceImpl訂單號:2018071962207960
類名com.guanjian.until.OrderLockServiceImpl訂單號:20180719622073001
類名com.guanjian.until.OrderLockServiceImpl訂單號:20180719622073392
類名com.guanjian.until.OrderLockServiceImpl訂單號:20180719622074033
類名com.guanjian.until.OrderLockServiceImpl訂單號:20180719622074594
類名com.guanjian.until.OrderLockServiceImpl訂單號:20180719622075505
類名com.guanjian.until.OrderLockServiceImpl訂單號:20180719622076026
類名com.guanjian.until.OrderLockServiceImpl訂單號:20180719622076507
類名com.guanjian.until.OrderLockServiceImpl訂單號:20180719622076998
類名com.guanjian.until.OrderLockServiceImpl訂單號:20180719622077639ui

進入zookeeper,咱們能夠看到/bit目錄已經建立this

相關文章
相關標籤/搜索