- 线程安全性主要有三个方面:
- 原子性:提供了互斥访问,同一时刻只能有一个线程对主内存进行成功修改
- 可见性:一个线程对主内存的修改可以及时被其他线程看到
- 有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序的存在,该观察结果一般是无序
- 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 次该方法,这些等待的线程开始执行之后的操作
-
ReentrantReadWriteLock
-- readLock() 获得读锁,是共享锁
-- writeLock() 获得写锁,是互斥锁 -
线程池
- ThreadPoolExecutor有以下几个重要参数:
-- int corePoolSize:初始化线程池时最小线程数量
-- int maxPoolSize:允许最大的线程数量
-- BlockingQueuequeue:如果线程请求任务多于创建的线程,任务会存放到阻塞队列,等待线程执行
-- 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() 不用的时候记得关闭