package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* @author wzq
* date: 2019/12/23 11:28
* description:
*/
public class OrderService implements Runnable {
private static CyclicBarrier cb = new CyclicBarrier(60);
// 订单号生成类
// 将orderNumGenerator或者count任意一处加上static,getNumber()加上同步锁,依然是线程安全的,因为使用的是同一个generator,而且加了锁是线程安全的
// 效果等同于静态锁,很多OrderService实例共用一把锁
private OrderNumGenerator orderNumGenerator = new OrderNumGenerator();
// 实现方式1
//private DistributeLock lock = new ZookeeperDistributeLock();
// 实现方式2
//private DistributeLock lock = new ZookeeperDistributeLock2();
/**
* 这么多OrderService实例共用一把锁,可以保证线程安全,但在集群部署多机模式下,
* 即便每台机器一次有一个请求获得锁,机器足够多依然会导致并发问题
*/
private static Lock rtLock = new ReentrantLock();
//实现方式3,redis分布式锁
//private Jedis jedis = ();
private Jedis jedis = ();
public void run() {
try {
();
} catch (InterruptedException | BrokenBarrierException e) {
();
}
getNumber();
}
public void getNumber() {
String requestId = ().toString();
try {
//();
//();
// Redis服务端单机部署,需要回调
// redis锁使用此段生成订单代码
/*if ((jedis, "lock", requestId, 2000)) {
String number = ();
(().getName() + "-" + () + ",产生了订单:" + number);
} else {
();
}*/
// zookeeper锁或者不加锁使用此段生成代码订单
String number = ();
(().getName() + "-" + () + ",产生了订单:" + number);
} catch (Exception e) {
();
} finally {
//();
//();
//Redis服务端单机部署,需要回调
//(jedis, "lock", requestId);
}
}
public static void main(String[] args) {
("####生成了订单####");
for (int i = 0; i < 60; i++) {
new Thread(new OrderService()).start();
}
}
}