java多线程学习小结

阅读说明

以下内容仅为个人学习总结,并不代表权威解释。
如有谬误还请在留言区斧正。

概述

多线程的同步与并发。主要解决在多线程或多进程时对于资源的调度以和同步等问题。避免因为对资源的抢夺而出现的数据不一致和死锁等BUG。

除基础的synchronized以外,java的多线程能力主要由java并发包提供(java.util.concurrent及其子包)。

主要提供了以下五个方面的能力:

  1. 提供了类别synchronized但具备更多能力,针对与不同应用场景的lock工具。如ReentrantLock[重进锁],ReentrantReadWriteLock,StampedLock[标记锁]等。
  2. 提供了比synchronized更加高级的多种同步结构。如CountDownLatch,CyclicBarrier,Semaphore[信号量],Phaser[相位器]等。
  3. 提供了各种线程安全的容器。CopyOnWriteArrayList,ConcurrentHashMap,ConcurrentSkipListMap等。
  4. 提供了各种并发队列。ArrayBlockingQueue,SynchronizeQueue,PriorityBlockingQueue等。
  5. 提供了ThreadPoolExecutor,Executors等线程的快速创建工具。

lock工具

提供了对锁的不同应用机制的封装类。

Lock

ReentrantLock
ReentrantReadWriteLock.ReadLock
ReentrantReadWriteLock.WriteLock

ReadWriteLock

ReentrantReadWriteLock

StampedLock

高级同步结构

CountDownLacth
允许多个或多个线程等待某些操作完成。
该结构不可重置,无法从用。
基本操作组合:countDown/await
在一个或多个线程中countDown次数足够,则事件启动。
CyclicBarrier
一种辅助性的同步结构,允许多个线程等待到达某个屏障后开始执行操作。
可重用设定好的限制。
基本操作:await
当所有的伙伴(parties [包含但不限于,子线程])都调用了await,才会继续执行任务,并自动进行重试。
典型应用场景:等待并发线程结束。
Semaphore
Java版本的信号量的实现,通过控制一定数量的允许(permit)的方式,来达到限制通用资源访问的目的。
基本操作:acquire/release 在调用acquire时进入互斥状态。
本质是一个计数器。
Phaser
待完善

线程安全容器

Collection

List

CopyOnWiteArrayList

Set

AbstractSet

CopyOnwriteArraySet

Map

ConcurrentMap

ConcurrentHashMap

ConcurrentNavigableMap

ConcurrentSkipListMap

NavigableSet

ConcurrentSkipListSet

CopyOnWrite*
在修改时先拷贝一份现有数据,在修改完成后再替换现有数据。是一个重量级的操作。
ConcurrentHashMap
内容无序,修改快速。
ConcurrentSkipListMap
基于key排序,内容有序,修改慢
ConcurentSkipListSet
基于排序规则排序(默认自然排序,可自定义),内容有序,修改慢

并发队列

Queue

ConcurrentLinkedQueue

Deque

ConcurrentLinkedDeque

BlockingDeque

LinkedBlockingDeque

BlockingQueue

TransferQueue

LinkedTransferQueue

SynchronousQueue
PriorityBlockingQueue
LinkedBlockingQueue
ArrayBlockingQueue
DelayQueue

Concurent*
该类容器基于lock-free模式实现,提供较高的吞吐量操作,是真正意义上的代表并发操作。没有类似CopyOnWrite容器的重量级开销,但遍历时存在若一致性问题。(使用迭代器遍历时,容器发生修改仍然可以继续进行遍历,但进行size等操作时准确性有限)
*BlokingQueue,*BlokingDeque
内部时基于锁来实现线程同步的。
*Deque
支持队列头部和尾部都进行插入和删除操作。
*BlockingQueue
获取时(take)等待元素进队,插入时(put)等待队列出现空位
LinkedTransferQueue
无边界
PriorityBlockingQueue
无边界优先队列
DelayQueue
无边界
ArrayBlockingQueue
有界
由final变量指定的容量
LinkedBlockingQueue
有界
默认 Integer.MAX_VALUE,可设置
SynchronousQueue
容量为0
删除等待插入,插入等待删除
java6 中以CAS替换了原有锁的逻辑,同步开销小。

线程工具

ThreadPoolExecutor
线程自定义创建类
主要参数:
int corePoolSize, 核心线程数,等于0时 无任务时销毁线程池中的线程。大于0时,永久保留设定线程数量的线程数。
int maximumPoolSize, 最大线程数,线程池中能够容纳同时执行的最大线程数。必须大于等于1,且当 最大线程数 = 核心线程数时,线程数大小固定。
long keepAliveTime, 表示线程池中线程空闲时间
TimeUnit unit, 表示空闲事件的单位
BlockingQueue workQueue, 使用的线程队列。当请求线程数大于核心线程数时,线程进入队列中,队列达到上限后,如果还有新的任务需要,则线程池会创建新的线程。
ThreadFactory threadFactory, 线程工厂,用来生产一组面向任务的线程,线程池的命名,是通过给这个工厂(factory)增加组名前缀来实现的,可用于区分线程所产生的工厂。
RejectedExecutionHandler handler 当请求被拒绝时的处理办法。一般策略:
a.保存到数据库,空闲时再处理。
b.转向某个提示页面
c.打印日志
Executors
线程的静态工厂方法。可以创建ForkjoinPool ThreadPoolExecutor ScheduledThreadPoolExcutor 等三个线程池的包装对象。
Executors.newScheduledThreadPool 创建虚拟机能够支持的最大线程数的线程池。
Executors.newCachedThreadPool 可伸缩的线程池,最大可致 Integer.MAX_SIZE。
Executors.newScheduledThreadPool 创建一个定时周期性执行的任务线程,须设置核心线程数,最大可致 Integer.MAX_SIZE。相对与Timer和SecheduledExecutorService更加安全。
Executors.newSingleThreadExecutor 创建一个单线程的线程池,相当于单线程串行执行所有任务,保证任务的提交顺序执行。
Executors.newFixedThreadPool 输入参数既是固定线程数,线程池没有可伸缩性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值