面试刷题19:并发工具包有哪些工具?

java.util.concurrent包提供了大量的并发工具。

大家好,我是李福春,今天的题目是:

java提供的并发工具有哪些?

答:java.util.concurrent工具包中提供的工具分4大类。

一, 同步工具,CountDownLatch, CyclicBarrier , Semaphore ;
二, 并发安全容器, ConcurrentHashMap,ConcurrentSkipListMap,
CopyOnWriteArrayList,CopyOnWriteArraySet;
三,并发安全队列,主要用在线程池上,ArrayBlockingQueue,SynchronousQueue,PriorityBlockingQueue;
四,并发线程池executor框架;

同步工具

semaphore

信号量,设置并发访问的线程数量。

一般要结对使用: try{s.acquire();}finally{s.release()}

package org.example.mianshi.synctool;

import java.util.concurrent.Semaphore;

/**
 * 创建日期:  2020/3/30 14:24
 * 描述:     信号量应用
 *
 * @author lifuchun
 */

public class SemaphoreApp {

    public static void main(String[] args) {

        Semaphore semaphore = new Semaphore(0);

        for (int i = 1; i <= 10; i++) {
            new MyThread(semaphore).start();
        }

        System.out.println("go ```");
        semaphore.release(5);

    }

    public static class MyThread extends Thread {

        private Semaphore semaphore;

        public MyThread(Semaphore semaphore) {
            this.semaphore = semaphore;
        }

        @Override
        public void run() {

            try {

                semaphore.acquire();

                System.out.println(System.currentTimeMillis() + " :" + Thread.currentThread().getName() + " -execute ```");

            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release();
            }

        }
    }

}

CountDownLatch

设置线程等待某些操作完成;

其它线程完成了,调用 c.countDown()

当c的value=0,即执行 其它线程在 await()方法后面逻辑。

package org.example.mianshi.synctool;

import java.util.concurrent.CountDownLatch;
import java.util.stream.IntStream;

/**
 * 创建日期:  2020/3/30 14:38
 * 描述:     countDownLatch的例子
 * @author lifuchun
 */

public class CountDownLatchApp {

    public static void main(String[] args) {

        CountDownLatch countDownLatch = new CountDownLatch(5);

        new Thread(() -> {

            try {
                countDownLatch.await();

                System.out.println("后置任务");

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        IntStream.rangeClosed(1, 10)
                .forEach(i -> new MyThread(countDownLatch).start());

    }

    public static class MyThread extends Thread {

        private CountDownLatch countDownLatch;

        public MyThread(CountDownLatch countDownLatch) {
            this.countDownLatch = countDownLatch;
        }

        @Override
        public void run() {

            countDownLatch.countDown();

            System.out.println("前置任务");

        }
    }

}

CyclicBarrier

允许多个线程同时到达某个屏障。 设置并发执行的线程数量。

一般调用await()方法,当数量达到预设的数量N,则统一执行await()方法后面的逻辑,会自动重置。

package org.example.mianshi.synctool;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.stream.IntStream;

/**
 * 创建日期:  2020/3/30 14:49
 * 描述:     cyclicBarrier的应用
 *
 * @author lifuchun
 */

public class CyclicBarrierApp {

    public static void main(String[] args) {

        CyclicBarrier cyclicBarrier = new CyclicBarrier(3, CyclicBarrierApp::run);

        IntStream.rangeClosed(1, 30)
                .forEach(i -> new MyThread(cyclicBarrier).start());

    }

    private static void run() {
        System.out.println("reset , start again !");
    }

    public static class MyThread extends Thread {

        private CyclicBarrier cyclicBarrier;

        public MyThread(CyclicBarrier cyclicBarrier) {
            this.cyclicBarrier = cyclicBarrier;
        }

        @Override
        public void run() {

            try {
                cyclicBarrier.await();
            } catch (InterruptedException | BrokenBarrierException e) {
                e.printStackTrace();
            }

            System.out.println("do my work!");

        }
    }

}

同步安全容器

类层级如下图:

场景选择:

1, 如果注重的是并发放入和获取的速度,使用ConcurrentHashMap ;?

2, 如果注重顺序,并且频繁并发修改大量的数据,使用ConcurrentSkipListMap

CopyOnWrite*防御复制:

add,set,remote操作都会copy原数组,修改完成之后替换原来的数组,代价比较大,适合读多写少的场景;

小结

本篇回答了java.util.concurrent工具包中的分类的工具,主要介绍了3个同步工具,Semaphore , CountDownLatch, CyclicBarrier? ;

然后画出了并发安全容器的类层级图,分析了不同的场景下如何选择合适的并发安全容器。

原创不易,转载请注明出处。

原文地址:https://www.cnblogs.com/snidget/p/12598857.html

时间: 2024-10-07 19:43:53

面试刷题19:并发工具包有哪些工具?的相关文章

面试刷题21:java并发工具中的队列有哪些?

![image.png](https://img2020.cnblogs.com/other/268922/202003/268922-20200330183801141-1514127119.png) java的线程池的工作队列用到了并发队列.队列一般用在生产者消费者的场景中,处理需要排队的需求. 你好,我是李福春,今天的问题是: ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别? 答:都是java提供的并发安全队列,都提供了等待性的操作,take,

有效的括号序列——算法面试刷题4(for google),考察stack

给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and ']', 判定是否是有效的括号序列. 括号必须依照 "()" 顺序表示, "()[]{}" 是有效的括号,但 "([)]" 则是无效的括号. 您在真实的面试中是否遇到过这个题? 样例 样例 1: 输入:"([)]" 输出:False 样例 2: 输入:"()[]{}" 输出:True 挑战 O(n)的时间

有效单词词广场——算法面试刷题5(for google),考察数学

给定一个单词序列,检查它是否构成一个有效单词广场.一个有效的单词广场应满足以下条件:对于满足0≤k<max(numRows numColumns)的k,第k行和第k列对应的字符串应该相同,. 给定的单词数量至少为1,且不超过500.单词长度至少为1,不超过500.每个单词只包含小写英文字母a-z. 您在真实的面试中是否遇到过这个题?  是 题目纠错 样例 样例1 输入: [ "abcd", "bnrt", "crmy", "dty

面试刷题11:java系统中io的分类有哪些?

随着分布式技术的普及和海量数据的增长,io的能力越来越重要,java提供的io模块提供了足够的扩展性来适应. 我是李福春,我在准备面试,今天的问题是: java中的io有哪几种? java中的io分3类: 1,BIO ,即同步阻塞IO,对应java.io包提供的工具:基于流模型,虽然直观,代码实现也简单,但是扩展性差,消耗资源大,容易成为系统的瓶颈: 2,NIO,同步非阻塞io,对应java.nio包提供的工具,基于io多路复用:核心类: Channel ,Selector , Buffer ,

面试刷题26:新冠攻击人类?什么攻击java平台?

可恶的新冠病毒攻击人类,搞得IT就业形势相当不好?好在有钟南山院士带领我们提前开展好了防护工作! java作为基础平台安装在各种移动设备,PC,小型机,分布式服务器集群,各种不同的操作系统上.所以,对java平台层面的攻击也是最多的. 我是李福春,我在准备面试,今天的题目是: Java平台的注入攻击有哪些? 答:攻击需要找到安全漏洞,所谓的安全漏洞是:绕过安全系统限制或者利用程序瑕疵. java平台常见的注入攻击方式如下. 注入攻击 此外还有中间人攻击:即恶意用户在局域网段发送广播,声称自己是服

面试刷题30:SpringBean的生命周期?

spring是Java软件开发的事实标准. 我是李福春,我在准备面试,今天的问题是:springBean的生命周期是怎样的? 答:spring最基础的能力是IOC(依赖注入),AOP(面向切面编程),ioc改善了模块之间的耦合问题, 依赖注入的方式:set方法,构造方法,成员变量+ @Autowire? :Bean的管理是IOC的主要功能. bean的生命周期完全由spring容器管理,从属性设置到各种依赖关系的注入,简化了开发人员对bean的生命周期认知: Spring的容器中Bean生命周期

【刷题】面筋-测开-测试工具总结

性能测试工具 LoadRunner分哪三部分? 脚本生成器: 场景控制器: 结果分析器: LoadRunner进行测试的流程? 1. 测试测试 2. 创建虚拟用户脚本 3. 创建运行场景 4. 运行测试脚本 5. 监视场景 6. 分析测试的结果 END 原文地址:https://www.cnblogs.com/anliux/p/12695063.html

阿里最全面试100题:阿里天猫、蚂蚁金服、阿里巴巴面试题含答案

[阿里天猫.蚂蚁.钉钉面试题目] 1.微信红包怎么实现. 2.海量数据分析. 3.测试职位问的线程安全和非线程安全. 4.HTTP2.0.thrift. 5.面试电话沟通可能先让自我介绍. 6.分布式事务一致性. 7.nio的底层实现. 8.jvm基础是必问的,jvm GC原理,JVM怎么回收内存. 9.Java是什么. 10.API接口与SDI接口的区别(API是提供给别人的接口). 11.dubbo如何一条链接并发多个调用.Dubbo的原理,序列化相关问题. 12.用过哪些中间件. 13.做

【leetcode刷题笔记】Sum Root to Leaf Numbers

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 / 2 3 T