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

相关文章
相关标签/搜索