首页 > 其他分享 >并发集合测试

并发集合测试

时间:2024-02-05 11:13:18浏览次数:13  
标签:Thread System channels 并发 测试 集合 println public out

场景:某个集合正在被遍历的时候,给集合加入新元素,这个时候是会抛并发修改异常还是正常?如果正常的话,能不能拿到新获取的元素?

KeySetView

public class concurrentTest {
    public static void main(String[] args) {
        Set<String> channels = ConcurrentHashMap.newKeySet();
        channels.add("haha");
        channels.add("hehe");
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    Thread.sleep(1500);
                    channels.add("lulu");
                    System.out.println("add lulu:" + System.currentTimeMillis());
                } catch (InterruptedException e) {

                }
            }
        }).start();
        channels.forEach(
                s -> {
                    try {
                        Thread.sleep(2000);
                        System.out.println(s + ":" +  System.currentTimeMillis());
                    } catch (InterruptedException e) {

                    }
                }
        );


    }
}

image.jpeg

在KeySetView初始化后 遍历过程中加入的元素,都不会被访问到。

 

HashSet

    public static void main(String[] args) {
        Set<String> channels = new HashSet<>();
        channels.add("haha");
        channels.add("hehe");
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    Thread.sleep(3000);
                    channels.add("lulu");
                    System.out.println("add lulu:" + System.currentTimeMillis());
                } catch (InterruptedException e) {

                }
            }
        }).start();
        channels.forEach(
                s -> {
                    try {
                        Thread.sleep(2000);
                        System.out.println(s + ":" +  System.currentTimeMillis());
                    } catch (InterruptedException e) {

                    }
                }
        );


    }

image.jpeg

 

        for (String s: channels) {
            try {
                Thread.sleep(2000);
                System.out.println(s + ":" +  System.currentTimeMillis());
            } catch (InterruptedException e) {

            }
        }

 

        Iterator<String> iter = channels.iterator();
        while (iter.hasNext()) {
            String s = iter.next();
            try {
                Thread.sleep(2000);
                System.out.println(s + ":" +  System.currentTimeMillis());
            } catch (InterruptedException e) {

            }

        }

 

    public static void main(String[] args) {
        Set<String> channels = new HashSet<>();
        channels.add("haha");
        channels.add("hehe");
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    Thread.sleep(3000);
                    channels.remove("hehe");
                    System.out.println("rm hehe:" + System.currentTimeMillis());
                } catch (InterruptedException e) {

                }
            }
        }).start();
/*        channels.forEach(
                s -> {
                    try {
                        Thread.sleep(2000);
                        System.out.println(s + ":" +  System.currentTimeMillis());
                    } catch (InterruptedException e) {

                    }
                }
        );*/
/*        for (String s: channels) {
            try {
                Thread.sleep(2000);
                System.out.println(s + ":" +  System.currentTimeMillis());
            } catch (InterruptedException e) {

            }
        }*/
        Iterator<String> iter = channels.iterator();
        while (iter.hasNext()) {
            String s = iter.next();
            try {
                Thread.sleep(2000);
                System.out.println(s + ":" +  System.currentTimeMillis());
            } catch (InterruptedException e) {

            }

        }
        iter = channels.iterator();
        while (iter.hasNext()) {
            String s = iter.next();
            try {
                Thread.sleep(2000);
                System.out.println(s + ":" +  System.currentTimeMillis());
            } catch (InterruptedException e) {

            }

        }

    }

image.jpeg

 

并发锁测试

 

public class conTest1 {

    private static Object lock = new Object();
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    printC();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    printB();
                }
            }
        }).start();

    }

    public static void printA() {
        synchronized (lock) {
            while (true) {
                try {
                    Thread.sleep(1000);
                    System.out.println("A");
                } catch (InterruptedException e) {

                }
            }

        }
    }

    public static void printB() {
        synchronized (lock) {
            System.out.println("B");
        }
    }

    public static void printC() {
        synchronized (lock) {
            System.out.println("C");
        }
    }


}
  • 相同锁对象时,B和C交替拿锁,A拿到锁后,B就执行拿不到锁了,执行不了;

  • 如果A和B拿的是不同的锁对象,那么A和B都可以执行

标签:Thread,System,channels,并发,测试,集合,println,public,out
From: https://www.cnblogs.com/ljf-0/p/18007583

相关文章

  • 假期想学习,送你测试开发+人工智能大礼包
    测试管理班是专门面向测试与质量管理人员的一门课程,通过提升从业人员的团队管理、项目管理、绩效管理、沟通管理等方面的能力,使测试管理人员可以更好的带领团队、项目以及公司获得更快的成长。提供1v1私教指导,BAT级别的测试管理大咖量身打造职业规划。春节将至,大家在享受假......
  • 测试开发+人工智能大礼包,让你在假期实现弯道超车
    春节将至,大家在享受假期的同时,不要忘记假期之后就是金三银四了哦。如何在春节期间实现弯道超车?在面试之前做足准备,你有计划了么?这个春节假期不要再乱学了,现在送你一份「测试开发+人工智能精品课礼包」,跟着我们的节奏来。学习虽然没有捷径,但是有路径。这套课程是霍格沃兹测试开发学......
  • [职场] 测试工程师的英文简历怎么写
    每个求职者肯定都有一份简历,但是往往一份中文简历不能满足所有需求,还需要一份英文简历,但是大部分人都不知道英文简历怎么写?这里有一份测试工程师的英文简历模板供大家参考。Lanshanshanphone:12345678910email:jianlijianli.comTestEngineerFocusingonhe......
  • 如何保障代码覆盖率?它和精准测试有什么关系?
    前言大家好,我是chowley,今天来聊一聊代码覆盖率和精准测试两者之间的关系。在软件开发和测试中,代码覆盖率是一个重要的指标,它可以帮助我们评估测试用例对源代码的覆盖程度。精准测试则注重深入挖掘特定功能或模块的问题。1.了解代码覆盖率的类型在开始之前,让我们先了解几种常见......
  • Java并发(二十三)----同步模式之保护性暂停
    1、定义即GuardedSuspension,用在一个线程等待另一个线程的执行结果要点有一个结果需要从一个线程传递到另一个线程,让他们关联同一个GuardedObject如果有结果不断从一个线程到另一个线程那么可以使用消息队列JDK中,join的实现、Future的实现,采用的就是此模式因......
  • java Atomic原子类&&常见并发容器
    Atomic原子类Atomic原子类介绍Atomic翻译成中文是原子的意思。在这里Atomic是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。所以,所谓原子类说简单点就是具有原子/原子操作特征的类。并发包 java.util.concurrent 的原......
  • UI自动化测试代码不想写脚本不想配?RunnerGo一键录制
    想快速配置可视化UI自动化测试脚本?RunnerGo近期上线脚本录制器,根据你的测试操作直接生成UI自动化测试脚本,下面是使用方法Step1:下载录制器点击RunnerGo上方插件按钮下载录制器Step2:录制器使用将插件文件拖入浏览器扩展程序点击打开录制器,在浏览器中进行操作时录制器会将操作录制为......
  • 快速使用 timeit 测试代码运行速度
    Python中要测试代码速度,比起start_time=time.time()然后end_time=time.time(),更便捷的方法是使用timeit。以下是测试lambda表达式与普通判断语句速度的代码。运行10000次,打印各自运行时间。结果是lambda虽然优雅但更慢。importtimeitimportnumpyasnpensur......
  • UI自动化测试代码不想写脚本不想配?RunnerGo一键录制
    想快速配置可视化UI自动化测试脚本?RunnerGo近期上线脚本录制器,根据你的测试操作直接生成UI自动化测试脚本,下面是使用方法Step1:下载录制器点击RunnerGo上方插件按钮下载录制器 Step2:录制器使用将插件文件拖入浏览器扩展程序 点击打开录制器,在浏览器中进行操作时录制器......
  • 第四章:集合运算
    第四章:集合运算4.1表的加减法4.1.1什么是集合运算集合在数学领域表示“各种各样的事物的总和”,在数据库领域表示记录的集合。具体来说,表、视图和查询的执行结果都是记录的集合,其中的元素为表或者查询结果中的每一行。在标准SQL中,分别对检索结果使用UNION,INTERSECT,EXCEPT......