神马是分布式锁呢,就是利用服务器集群的特性,如zookeeper或者mysql,redis对多台分布式服务器的进程进行只允许一台服务器的一个进程来进行一个同步操作的过程,其他任务服务器的进程只能等待,进行自旋。
用zookeeper锁,我们用到的zookeeper客户端的一个依赖。
<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();
}
这里依然已订单编号为例,一个订单编号的接口。
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或者其他可重入锁之类的。
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集群
运行结果
类名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订单号:20180719622077639
进入zookeeper,我们可以看到/bit目录已经创建