RuiCode

  • 首页
  • 归档

  • 搜索
操作系统 并发 排序 网络 源码分析 二分法 面试 不重复算法 指针移动 java 算法 mysql Linux

【面试经】JAVA并发编程2--线程安全性、AQS、线程池

发表于 2020-02-25 | 分类于 面试经 | 0 | 阅读次数 229
  1. 线程安全性主要有三个方面:
  • 原子性:提供了互斥访问,同一时刻只能有一个线程对主内存进行成功修改
  • 可见性:一个线程对主内存的修改可以及时被其他线程看到
  • 有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序的存在,该观察结果一般是无序
  1. AQS常用组件
  • 以下组件线程安全,可以在不同的线程中使用,目的是控制线程执行顺序、同时执行数量、执行时机等,方便管理不同线程
  • CountDownLatch
    -- new CountDownLatch(int val)
    -- countDown() -1
    -- await() 阻塞线程 等待为0 可以设置最大等待时间
  • Semaphore
    -- new Semaphore(int val)
    -- acquire() 获得一个信号,可以指定值获得多个信号;如果没有获得,线程会阻塞
    -- release() 释放一个信号
    -- tryAcquire() 尝试获得信号,如果可以获得信号,返回true,可以指定等待时间
  • CyclicBarrier
    -- new CyclicBarrier(int val)
    -- await() 线程等待,知道调用了 val 次该方法,这些等待的线程开始执行之后的操作
  1. ReentrantReadWriteLock
    -- readLock() 获得读锁,是共享锁
    -- writeLock() 获得写锁,是互斥锁

  2. 线程池

  • ThreadPoolExecutor有以下几个重要参数:
    -- int corePoolSize:初始化线程池时最小线程数量
    -- int maxPoolSize:允许最大的线程数量
    -- BlockingQueue queue:如果线程请求任务多于创建的线程,任务会存放到阻塞队列,等待线程执行
    -- RejectedExecutionHandler handle:拒绝执行策略,当queue满了的时候,是报错 还是主线程执行任务 还是丢弃最开始的任务 还是丢弃该任务
    -- ThreadFactory threadFactory:创建线程的工厂
    -- long keepAliveTime:当目前线程数量多于corePoolSize且部分线程处于空闲状态,最多存活时间
  • ThreadPoolExecutor 继承 ExecutorService,一般用Executors工具类创建线程池,newCachedThreadPool(), newFixedThreadPool(int corePoolSize), newScheduledThreadPool(int corePoolSize)
  • executor(Runnable task) 无返回值
  • submit(Callable task) 返回一个待处理的Future
  • shutDown() 不用的时候记得关闭
  • 本文作者: RuiCode
  • 本文链接: https://www.ruicode.cn/archives/java并发编程2--线程安全性aqs线程池
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# 操作系统 # 并发 # 排序 # 网络 # 源码分析 # 二分法 # 面试 # 不重复算法 # 指针移动 # java # 算法 # mysql # Linux
【面试经】JAVA并发编程1--synchronized
堆排序总结
  • 文章目录
  • 站点概览
RuiCode

RuiCode

19 日志
5 分类
13 标签
Creative Commons
© 2021 RuiCode
由 Halo 强力驱动
|
主题 - NexT.Pisces v5.1.4

冀公网安备 13050002001906号