• JUC(2)


    举例说明集合类是不安全的:

    list不安全:

    Vector线程安全  但是要尽量少用Vector  性能慢

    ArrayList线程不安全 读写效率提升 但是数据一致性下降  扩容为原来的一半

    Collections.synchronizedList(new ArrayList<>());线程安全      ======CopyOnWriteArrayList

    new CopyOnWriteArrayList<>();(有逼格)  读写分离的思想

    HashSet不安全   底层是hashmap key是存的值 ,value是一个固定的Object       Collections.synchronizedSet();======>    CopyOnWriteArraySet

    HashMap不安全   底层是:数组+链表+红黑树      Node类型的节点 Node里面存 K-V  new HashMap(initialCapacity,负载因子) 扩容为原来的一倍     

    Collections.synchronizedMap();     ==============>ConcurrentHashMap();

    ========================================================================

    Callable  第三种多线程的方法

    FutureTask即实现了Runnable 在构造方法中又有Callable 所以可以用FutureTask来实现Callable和Runnable之间链接的桥梁(Java多态的思想 传一个参数代表传了一堆)

    get方法请放在最后一行

    不管有几个线程调用同一个FutureTask对象,都只会调用一次

    =================================================

     * CountDownLatch

    主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。 * 其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),
     * 当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。

    ===================================================

    CyclicBarrier 

    做加法:

    ================================================

    semaphore

     在信号量上我们定义两种操作:
     * acquire(获取) 当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1),
     *       要么一直等下去,直到有线程释放信号量,或超时。
     * release(释放)实际上会将信号量的值加1,然后唤醒等待的线程。
     * 
     * 信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。

    如果把semaphore换成1,相当于Synchronized

     

     ================================================

    ReadWriteLock

    ===============================

    blockingQueue

     

     ====================================================

    ThreadPoolExecutor

    Array-》Arrays 数组工具类

    Collection-》Collections集合工具类

    --------------》Executor-》Executors 线程工具类

     ThreadPoolExecutor 线程池玩的就是这个 

     线程池七大参数:

     

    1、在创建了线程池后,开始等待请求。
    2、当调用execute()方法添加一个请求任务时,线程池会做出如下判断:
      2.1如果正在运行的线程数量小于corePoolSize,那么马上创建线程运行这个任务;
      2.2如果正在运行的线程数量大于或等于corePoolSize,那么将这个任务放入队列;
      2.3如果这个时候队列满了且正在运行的线程数量还小于maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务;
      2.4如果队列满了且正在运行的线程数量大于或等于maximumPoolSize,那么线程池会启动饱和拒绝策略来执行。
    3、当一个线程完成任务时,它会从队列中取下一个任务来执行。
    4、当一个线程无事可做超过一定的时间(keepAliveTime)时,线程会判断:
        如果当前运行的线程数大于corePoolSize,那么这个线程就被停掉。
        所以线程池的所有任务完成后,它最终会收缩到corePoolSize的大小。

     线程池最大容纳参数是最大PoolSize+queue数

     

    =========================================================

    Java内置核心四大函数式接口:

     

     

     ===============================

    分支合并框架     

    计算1-100的值:分支就涉及到返回值,有返回值就要用Callable,而Future实现了Callable接口,

    所以实现了Future接口的ForkJoinTask,以及实现了RecursiveTask就可以作为ForkJoinPool的传入参数了

     

    ForkJoinPool的submit方法要传入一个ForkJoinTask的参数:

     

     

     ========================

    CompletableFuture

    CompletableFuture runAsync()没有返回值

    CompletableFuture supplyAsync 有返回值///////supply 供给形函数接口

     

  • 相关阅读:
    常用设计模式
    文件上传相关报错: The current request is not a multipart request或is a MultipartResolver configured?
    Intellij IDEA 与 Gitlab 实现代码上传与下载
    Oracle两表关联,只取B表的第一条记录
    notepad++ 调整行间距
    Ubuntu18.04直接安装python3.7或者升级自带的python3.6版本之后导致终端无法打开的解决办法
    黑苹果之DELL台式机安装Mac OS X 10.13.6版本操作系统
    Windows Ping | Tracert 's Bat 脚本并行测试
    centos 7 修改 sshd | 禁止 root 登录及 sshd 端口脚本定义
    C语言中malloc函数的理解
  • 原文地址:https://www.cnblogs.com/doyi111/p/12549299.html
Copyright © 2020-2023  润新知