使用订单号加锁
OrderServlet
package com.mozq.http.http_01.thread;
public class OrderServlet {
public Integer num = 0;
/*
需求:方法不允许订单号相同的多个线程同时进入。
方案:订单号相同时,使用同一把锁。
*/
public void increase(int count){
//String orderNum = new String("Order0001");//相等但是非同一对象加锁失败。
//当调用intern()时,对象位于字符串常量池中,使用的是同一个对象,所以加锁成功。
String orderNum = new String("Order0001").intern();
synchronized (orderNum){
for (int i = 0; i < count; i++) {
num++;
}
}
}
}
模拟并发
package com.mozq.http.http_01.thread;
public class Thread_04 {
private static final int THREADS_COUNT = 20;
public static void main(String[] args) {
//创建一个OrderServlet对象
OrderServlet orderServlet = new OrderServlet();
//模拟并发请求对订单记录的操作
Thread[] threads = new Thread[THREADS_COUNT];
for (int i = 0; i < THREADS_COUNT; i++) {
threads[i] = new Thread(()->{
orderServlet.increase(10000);
});
threads[i].start();
}
//等待所有线程执行完毕
for(int i = 0; i < THREADS_COUNT; i++){
try {
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//打印结果
System.out.println(orderServlet.num);
}
}