一、cpu cache 层面volatile
二、灵活的同步机制 对应互斥和同步
volatile--> atomicXXX
syncronized-->Lock
wait/notify-->Condition/LockSupport
三、数据结构
1、ConcurrentHashMap 分段加锁(二级的map结构)
hashmap的实现:table数组里放了多个桶(bucket),一个桶对应一个hashcode,有冲突的时候用链表链接,jdk8中如果一个桶内的节点太多,会使用红黑树。
concurrencyLevel 分段的个数2^n
initialCapacity 整个map的初始值 每个entry的大小由
loadFactor每个分段的装载因子
modCount 修改的次数
高效的原因:分段加锁;读(不加锁)写分离
2、ConcurrentLinkedQueue(cas不加锁)
offer poll 适合于缓存消息(快),没有流量保护
为了减少CAS,可以一次多跳几个格
3、BlockingQueue 提供阻塞的方法,来平衡生产和消费之间的负载
put/take(内部是await)适合于实现生产者消费者(任务与实现分离)
ArrayBlockingQueue 有界、数组
LinkedBlockingQueue 有界、链表
PriorityBlockingQueue 支持优先级
DelayQueue 支持延时(缓存、定时任务)
SynchronousQueue:直接传递数据,不存储
LinkedTransferQueue transfer:阻塞到消费后才返回
LinkedBlockingDeque 双向,减少竞争
4、fork/join 与map/reduce类似,是"分治"算法思想
内部使用work-stealing,增加并行度
ForkJoinTask compute时需要确定分隔还是计算
5、atomXXX 原子 数组 引用 字段(对象的某个字段),提供 compareAndSet getAndIncrement
四、协作工具
1、CountDownLatch(外部数据结构)countdown/await更灵活的join
2、CyclicBarrier 所有线程都到达某个位置时,再继续
每个线程自己设置自己的位置 await
Phaser 更复杂的barrier:可以有多个阶段
3、Semaphore 资源限流(封装 mutex + condition)
acquire release tryAcquire
4、Exchanger 强制等待某个条件之后,交换数据
可以用于校对、遗传算法等
5、Mutex、condition、semaphore的区别
1》Mutex 保护的区域是代码片段,一次只会进入一个线程(面向过程),相关api是lock, unlock
2》condition 条件变量是一种同步机制,允许线程挂起,直到共享数据上的某些条件得到满足。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。这种环境下 条件本身同时被多个线程访问,所以需要加锁保护条件。线程在改变条件状态前先要锁住互斥量。条件变量使我们可以睡眠等待某种条件出现。条件变量要和互斥量相联结,以避免出现条件竞争--一个线程预备等待一个条件变量,当它在真正进入等待之前,另一个线程恰好触发了该条件。(目的是等到后再执行,现在则永远等不到信号)wait(线程释放mutex,被挂起到等待队列,不再占用cpu,被signal唤起前,会自动加锁) signal 唤醒同一个condition上wait的线程,不会自动释放锁
3》semaphore:mutex+condition(oop 变成了一个数据结构),支持多个条件值(不需要同步),相关api wait post
五、线程池(调度的是任务而不是消息)
1、好处:避免频繁创建;统一管理;提高响应速度
2、blockingQueue + workers
3、execute submit(future 会阻塞)shutdown
4、io密集型可以多设置一些线程数(一个时间片内能搞定),设置少了可能cpu会空闲
5、一般队列的长度是有限值
6、hotspot中,一个java thread对应一个内核线程,线程到cpu的映射由OS内核实现,用户任务的调度使用Executor来共享n个线程。
7、相关类
Executor
ThreadPoolExecutor
ScheduledThreadPoolExecutor 更强大的Timer
Future/FutureTask 异步计算的结果
Runnable/Callable 调度的对象
Executors 门面
8、步骤
new Callable
submit-->FutureTask
Futuretask.get/cancel 阻塞在这里
9、区别
FixedThreadPool 队列无限大,适合于负载重的server
SingleThreadExecutor 保证顺序,非并发
CachedThreadPool 线程数无限大,队列不缓存,适和于大量短任务
ScheduledThreadPoolExecutor 使用DelayQueue
SingleThreadScheduledExecutor
10、异步的操作:用线程池缓存,之后必须要结果时阻塞获取
六、异步回调(CompletableFuture)
Future = get cancel
RunnableFuture = Future + Runnable(可以调度和执行)
RunnableScheduledFuture = getDelay + RunnableFuture
FutureTask:线程池调度的东西
CompletionService 统一管理多个执行的结果 submit take get
CompletionStage :一个子步骤,支持丰富的各种流式操作(回调)
CompletableFuture:CompletionStage + Future,
总结:volatile/atomXXX->lock->wait/condition->并发集合->协作工具->线程池->异步回调
相关推荐
java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,...
java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类...
java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,...
java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类...
并发API 基于Vanilla Java的Java应用程序的抽象并发API。
java.awt.geom 提供用于在与二维几何形状相关的对象上定义和执行操作的 Java 2D 类。 java.awt.im 提供输入方法框架所需的类和接口。 java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的...
java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类...
java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,...
java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类...
Java Development Kit (JDK) 1.8是一个Java平台的开发环境。它提供了Java编译器、Java运行...此外,JDK 1.8还包含了JavaFX 8,一个新的Java图形用户界面工具包,以及新的工具和API,用于Java并发编程和日期/时间处理。
java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类...
它为访问和操纵Java编程语言中的状态提供了通用的基础抽象。 这个抽象是由crud-*系列中的其他项目实现的——例如, 包含一个基于 HTTP 的实现。 Crud API 支持基于通用Resources的面向数据的交互,这些交互封装了...
15.1.2 Java反射API412 15.1.3 Class类413 15.2 使用Java反射机制414 15.2.1 获取类型信息414 15.2.2 创建对象417 15.2.3 调用方法419 15.2.4 访问成员变量的值421 15.2.5 操作数组422 15.3 反射与动态代理424 ...
Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 Netty 是一个广泛使用的 Java 网络编程框架(Netty 在 2011 年获得了Duke's Choice Award,见...
Java时间API 集合 API 改进 并发 API 改进 选修课 Java 中的 Lambda 表达式与方法 Java 中的方法(或函数)具有以下主要部分: 名称 参数列表 身体 返回类型。 Java 中的 lambda 表达式有以下主要部分: Lambda ...
Concurrency(并发):强大,简单的抽象,让我们更容易实现简单正确的并发性代码。 1. ListenableFuture(可监听的Future): Futures,用于异步完成的回调。 2. Service: 控制事件的启动和关闭,为你管理复杂的...
第二部分详细讲解了jsf ri、jta、jndi、rmi、jms、javamail、ejb 3的session bean、message driven bean、jpa、jax-ws 2、jaas等java ee知识,这部分知识以jsf+ejb 3+jpa整合开发为重点,通过使用netbeans ide工具...