zoukankan      html  css  js  c++  java
  • ConcurrentLinkedQueue并发容器

    这是一个买票的问题

    public class TicketSeller2 {
        static Vector<String> tickets = new Vector<>(); 
        static {
            for (int i = 0; i < 1000; i++) {
                tickets.add("票-" + i);
            }
        }
        public static void main(String[] args) {
            for (int i = 0; i < 10; i++) {
                new Thread(() -> {
              //这里的size()和remove()都是原子性的,但问题会出现在size()和remove()之间
    while (tickets.size() > 0) { // 展现代码问题方法,将线程沉睡一会
                //当代吗醒来时,会有可能大量的高并发去争夺最后一张票,从而导致问题
    try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("销售了:" + tickets.remove(0)); } }).start(); } } }

    解决方案:

    public class TicketSeller3 {
    
        static List<String> tickets = new ArrayList<>();
    
        static {
            for (int i = 0; i < 1000; i++) {
                tickets.add("票-" + i);
            }
        }
    
        public static void main(String[] args) {
            for (int i = 0; i < 10; i++) {
                new Thread(() -> {
                    while (tickets.size() > 0) {
                        // sychronized 保证了原子性
                        synchronized (tickets) {
                            System.out.println("销售了:" + tickets.remove(0));
                        }
                    }
                }).start();
            }
        }
    }

    3.优化

    public class TicketSeller4 {
        static Queue<String> queue = new ConcurrentLinkedQueue<>();
        static {
            for (int i = 0; i < 1000; i++) {
                queue.add("票-" + i);
            }
        }
        public static void main(String[] args) {
            for (int i = 0; i < 10; i++) {
                new Thread(() -> {
                    while (true) {
                        String t = queue.poll(); // 取出头,拿不到就是空值
                        if (t == null) {
                            break;
                        }
                        System.out.println("销售了:" + t);
                    }
                }).start();
            }
        }
    }
  • 相关阅读:
    如何使用Remoting实现双工(转自Artech)
    解决自定义代码启动Approver Sharepoint 2010 Workflow,出现Failed on Start
    设计模式学习(目录)
    C#面向对象分析
    使用Sharepoint 2010 Client Object Model 通过SSL验证
    .NET 4.0 Location : 查看传感器状态变化
    OLAP和OLTP的 概念和区别
    组织结构及权限模型设计
    维度关系
    PHP正则替换中文让中文无处可躲
  • 原文地址:https://www.cnblogs.com/gxlaqj/p/11699079.html
Copyright © 2011-2022 走看看