私人MEMO--java.util.concurrent

以下是我私人的Memo,由于时间问题排版有点散漫,过段时间会整理好。


ConcurrentHashMap//分段锁 Segment

CopyOnWriteArrayList//写入时复制 会出现脏数据 使用ReentrantLock实现
CopyOnWriteArraySet//基于CopyOnWriteArrayList实现 唯一不同在于add时调用CopyOnWriteArrayList的addIfAbsent()方法
ArrayBlockingQueue//offer和put一把锁 take和poll一把锁 两把锁避免了读写竞争
ConcurrentLinkedQueue
PriorityQueue//非线程安全
ConcurrentSkipListMap/ConcurrentSkipListSet//分别是SortedMap和SortedSet的并发代替容器
LinkedBlockingQueue
ArrayBlockingQueue
SynchronousQueue

AtomicInteger//Integer的原子封装类
    incrementAndGet()//线程安全 本质是CAS锁    

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,  
    BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);
    corePoolSize:核心池大小 maximumPoolsize:线程池最大线程个数 KeepAliveTime:线程多久没有任务终止直到线程个数不大于核心池个数 BlockingQueue 阻塞队列
    execute(Runnable)
    RejectedExecutionHandler的实现:线程池中线程个数大于最大线程数后1、CallerRunsPolicy由调用这线程来执行 2、AbortPolicy 抛出RejectedExecutionException 3、DiscardPolicy不做任何动作 4、DiscardOldestPolicy 抛弃要执行的最后一个Runnable任务

newFixedThreadPool(int) 固定大小的线程池 阻塞队列为LinkedBlockingQueue 队列中task个数超出整型最大值抛出RejectedExecutionException
newSingleThreadExecutor() 大小为1的线程池 task只能同时被执行一个 其他都在阻塞队列LinkedBlockingQueue
newCachedThreadPool() 核心池大小为0 最大线程为Integer.MAX_VALUE 阻塞队列为SynchronousQueue task任务超出上限抛出RejectedExecutionException 线程存活1min
newScheduledThreadPool(int) 最大线程个数为Integer.MAX_VALUE 阻塞队列为DelayedWorkQueue keepAliveTime为0
    注意这个与Timer比的优势(Timer单线程、Timer存在线程逃逸、不能像线程池一样合理利用Callable)

FutureTask 用于要异步获取执行结果或者执行任务场景 传入Runnable和Callable的任务给FutureTask 调用get阻塞方法获取执行结果
    FutureTask可以确保即使调用了多次run方法,也只会执行一次Runnable或者Callable任务 或者通过cancel取消FutureTask地执行

CountDownLatch 并发包提供地一个控制多个线程同时开始某动作的类,方式为减数
    await() 判断计数是否为0 为0直接返回 否则进入队列进行等待 直到计数为0 或者线程被interrupt
    countdown() 使用CAS将计数减1 之后等于0返回true 不然返回false

CyclicBarrier
    基于ReentrantLock 和 Condition实现
    当await的线程个数到达设定数量才继续往下执行。
    await()首先加锁 然后count属性减1 减为0 执行传入的Runnable

ReentrantLock
    并发包提供的一个更方便的控制并发资源的类 和synchronized效果一致
    ReentrantLock()
    lock() 基于CAS的锁
    unlock()释放锁

Condition
    Condition是并发包中提供的一个接口,典型的实现有ReentrantLock,ReentranLock提供了一个newCondition方法,以便用户在同一个锁的情况下可以根据不同的情况执行等待或者唤醒动作。
    ReentranLock.newCondition创建一个AQS的内部类ConditionObject的对象实例
    ReentrantLock.newCondition().await() 将此线程加入此condition的等待队列,将线程置为等待状态。
    ReentrantLock.newCondition().signal() 从等待队列中取出一个线程 唤醒 signalAll方法可唤醒全部

ReentrantReadWriteLock
    ReentrantReadWriteLock和ReentrantLock没有任何继承关系。这个类提供了读锁和写锁。读写锁分离使得读多写少的场景大幅度提升读的性能。
    这个类通过AQS实现

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章