编辑: 苹果的酸 | 2013-04-16 |
for (int i = 0;
i <
20;
i++) { ThreadBuy client = new ThreadBuy(service);
client.start();
} } } class ServiceOrder { private final int MAX = 10;
DistributedLock DLock = new DistributedLock();
int n = 10;
public void handleOder() { String userName = UUID.randomUUID().toString().substring(0,8) + Thread.currentThread().getName();
String identifier = DLock.getLockWithTimeout( Huawei Mate
10 , 10000, 2000);
System.out.println( 正在为用户: + userName + 处理订单 );
if(n >
0) { int num = MAX - n + 1;
System.out.println( 用户: + userName + 购买第 + num + 台,剩余 + (--n) + 台 );
}else { System.out.println( 用户: + userName + 无法购买,已售罄! );
} DLock.releaseLock( Huawei Mate
10 , identifier);
} } class ThreadBuy extends Thread { private ServiceOrder service;
public ThreadBuy(ServiceOrder service) { this.service = service;
} @Override public void run() { service.handleOder();
} } 实践指导 步骤1 准备一台弹性云服务器(ECS),选择Windows系统类型. 步骤2 在ECS上安装JDK1.8以上版本和Eclipse,下载jedis客户端(点此处直接下载jar包). 步骤3 在华为云控制台购买DCS缓存实例.注意和ECS选择相同虚拟私有云、子网以及安全 组. 分布式缓存服务 最佳实践
1 使用 Redis 实现分布式锁 2019-03-20
3 步骤4 在ECS上运行Eclipse,创建一个java工程,为示例代码分别创建一个分布式锁实现类 DistributedLock.java和测试类:CaseTest.java,并将jedis客户端作为libs引用到工程中. 步骤5 将DCS缓存实例的连接地址、端口以及连接密码配置到示例代码文件中.注意有两处 需要配置密码信息,分别在getLockWithTimeout和releaseLock两个方法中. 步骤6 编译并运行得到结果. ----结束 运行结果 配置好实际的缓存实例连接地址、端口与连接密码,运行代码,得到以下结果: 正在为用户:eee56fb7Thread-16 处理订单 用户:eee56fb7Thread-16购买第1台,剩余9台 正在为用户:d6521816Thread-2 处理订单 用户:d6521816Thread-2购买第2台,剩余8台 正在为用户:d7b3b983Thread-19 处理订单 用户:d7b3b983Thread-19购买第3台,剩余7台 正在为用户:36a6b97aThread-15 处理订单 用户:36a6b97aThread-15购买第4台,剩余6台 正在为用户:9a973456Thread-1 处理订单 用户:9a973456Thread-1购买第5台,剩余5台 正在为用户:03f1de9aThread-14 处理订单 用户:03f1de9aThread-14购买第6台,剩余4台 正在为用户:2c315ee6Thread-11 处理订单 用户:2c315ee6Thread-11购买第7台,剩余3台 正在为用户:2b03b7c0Thread-12 处理订单 用户:2b03b7c0Thread-12购买第8台,剩余2台 正在为用户:75f25749Thread-0 处理订单 用户:75f25749Thread-0购买第9台,剩余1台 正在为用户:26c71db5Thread-18 处理订单 用户:26c71db5Thread-18购买第10台,剩余0台 正在为用户:c32654dbThread-17 处理订单 用户:c32654dbThread-17无法购买,已售罄! 正在为用户:df94370aThread-7 处理订单 用户:df94370aThread-7无法购买,已售罄! 正在为用户:0af94cddThread-5 处理订单 用户:0af94cddThread-5无法购买,已售罄! 正在为用户:e52428a4Thread-13 处理订单 用户:e52428a4Thread-13无法购买,已售罄! 正在为用户:46f91208Thread-10 处理订单 用户:46f91208Thread-10无法购买,已售罄! 正在为用户:e0ca87bbThread-9 处理订单 用户:e0ca87bbThread-9无法购买,已售罄! 正在为用户:f385af9aThread-8 处理订单 用户:f385af9aThread-8无法购买,已售罄! 正在为用户:46c5f498Thread-6 处理订单 用户:46c5f498Thread-6无法购买,已售罄! 正在为用户:935e0f50Thread-3 处理订单 用户:935e0f50Thread-3无法购买,已售罄! 正在为用户:d3eaae29Thread-4 处理订单 用户:d3eaae29Thread-4无法购买,已售罄! 不加锁场景 如果注释掉加锁代码,变成无锁情况,则抢购无序. //测试类中注释两行用于加锁的代码: public void handleOder() { String userName = UUID.randomUUID().toString().substring(0,8) + Thread.currentThread().getName();