zoukankan      html  css  js  c++  java
  • 使用订单号加锁

    使用订单号加锁

    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);
        }
    }
    
  • 相关阅读:
    Https的请求过程
    计算机网络知识
    数据结构之图
    Python3线程池进程池
    数据结构之堆heapq
    EffectivePython并发及并行
    EffectivePython类与继承
    EffectivePython并发及并行
    5.19完全数
    5.18数字全排列
  • 原文地址:https://www.cnblogs.com/mozq/p/12022369.html
Copyright © 2011-2022 走看看