使用订单号加锁

使用订单号加锁

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);
    }
}
posted @ 2019-12-11 14:29  没有理由不会呀  阅读(837)  评论(0编辑  收藏  举报