![](https://img-blog.csdnimg.cn/20190918140213434.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
多线程和并发编程
基础知识
SimpleProgramming17
Java,大数据,Python喜欢算法。
分享一些后端知识,记录学习过程。
软件工作遵循骑行自行车第一定律:不论你去哪,你都会顶风骑上坡。
展开
-
8.6 Exchanger
Exchanger 允许在并发线程中相互交换信息 允许在2个线程中定义同步点,当两个线程都到达同步点,它们交换数据结构 Exchanger exchange(),线程双方互相交互数据 交换数据是双向的 交换数据1 exchanger.exchange(input); //把用户输入传递给线程 String item = exchanger.exchange(null); 当两个线程都同时执行到同一个exchanger的exchange方法,两个线程就互相交换数据,交换是双向的。 交换数据2 S原创 2020-05-12 21:28:33 · 91 阅读 · 0 评论 -
8.5 Phaser
Phaser 允许执行并发多阶段任务,同步辅助类 在每一个阶段结束的位置对线程进行同步,当所有的线程都到达这步,再进行下一步。 Phaser arrive() arriveAndAwaitAdvance() 示例描述:假设举行考试,总共三道大题,每次下发一道题目,等所有学生完成后再进行下一道 import java.util.concurrent.Phaser; public class PhaserExample { /** * 假设举行考试,总共三道大题,每次下发一道题目,等所有学原创 2020-05-12 19:21:05 · 126 阅读 · 0 评论 -
8.4 Barrier
Barrier 集合点,也是一个同步辅助类 允许多个线程在某一个点上进行同步 CyclicBarrier 构造函数是需要同步的线程数量 await 等待其他线程,到达数量后,就放行 示例描述:假定有三行数,用三个线程分别计算每一行的和,最终计算总和 import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierEx原创 2020-05-12 19:06:18 · 101 阅读 · 0 评论 -
8.3 Latch类
Latch 英文原意,插销 等待锁,是一个同步辅助类 用来同步执行任务的一个或者多个线程(在某一个地方等待) 不是用来保护临界区或者共享资源,是用来协调各个线程,执行到某个地方的时候,大家都暂停一下,大家都到了,在往下执行 CountDownLatch(Latch 主要实现类) countDown() 计数减一 await() 等待latch 变成 0 示例描述:设想百米赛跑比赛 发令枪发出信号后选手开始跑,全部选手跑到终点后比赛结束 startSignal.await(); startSign原创 2020-05-12 14:02:21 · 167 阅读 · 0 评论 -
8.2 Semaphore
Semaphore 信号量:本质上是一个计数器 计数器大于0,可以使用,等于0不能使用 可以设置多个并发量,例如限制10个访问 Semaphore acquire 获取 release 释放 比Lock 跟进一步,可以控制多个同时访问关键区 示例描述: 现有一地下车库,共有车位5个,有10辆车需要停放,每次停放时,去申请信号量 import java.util.concurrent.Semaphore; public class SemaphoreExample { private fin原创 2020-05-12 13:28:31 · 116 阅读 · 0 评论 -
Java并发协作控制(8.1)
线程协作 Thread/Executor/Fork-join 线程启动,运行,结束 线程之间缺少协作 synchronized同步 限定只有一个线程才能进入关键区 简单粗暴,性能损失有点大 Lock 是synchronized升级版 Lock也可以实现同步的效果 实现更复杂的临界结构 tryLock方法可以预判锁是否空闲 允许分离读写的操作,多个读,一个写 性能更好 ...原创 2020-05-12 12:28:27 · 120 阅读 · 0 评论 -
Java并发数据结构(7.2)
Map(映射) Hashtable 同步安全,写多读少 HashMap 不安全 Collections.synchronizedMap(Map map) 基于synchronized,效率差 ConcurrentHashMap 读多写少,非阻塞 package map; import java.util.*; import java.util.concurrent.ConcurrentHashMap; public class MapTest{ public static voi原创 2020-05-11 23:08:57 · 223 阅读 · 0 评论 -
Java并发数据结构(7.1)
常用的数据结构是线程不安全的 ArrayList,HashMap,HashSet非同步的 多个线程同时读写,可能会抛出异常或数据错误 传统Vector,Hashtable等同步集合性能过差 并发数据结构:添加和删除 阻塞式集合:当集合为空或者满时,等待 非阻塞式集合:当集合为空或者满时,不等待,返回null或异常 List:数据列表类 Vector 同步安全,写多读少 ArrayList 不安全 Collections.synchronizedList(List list)基于synch.原创 2020-05-11 22:52:30 · 107 阅读 · 0 评论 -
并发框架Fork-Join(六)
Java7开始提供的一种并行框架:分解、治理、合并(分治编程) 适合于整体任务量不好确定的场合(最小任务可确定) 关键类: ForkJoinPool 任务池 RecursiveAction RecursiveTask 示例: import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; //分任务求和原创 2020-05-11 20:27:20 · 132 阅读 · 0 评论 -
Java并发框架Executor(五)
一、并行计算 业务:任务多,数据量大 串行 vs 并行 串行编程简单,并行编程难 单个计算核频率下降,计算核数增多,整体性能变高 并行困难(任务分配和执行过程 高度耦合) 如何控制粒度,切割任务 如何分配任务给线程,监督线程执行过程 并行模式 主从模式(Master-Slave):有一个主线程,其余都是从线程。主线程会指挥从线程去工作。 Worker模式(Worker to Worker/p2p):所有线程都是平等的,工作内容一样,无中心化的一种模式。从编程的角度来看,主从模式比较原创 2020-05-11 10:03:40 · 105 阅读 · 0 评论 -
Java多线程管理(四)
Java生命周期管理 线程类 粗粒度 细粒度: 线程之间有同步操作 等待 通知/唤醒 终止原创 2020-05-03 23:16:21 · 136 阅读 · 0 评论 -
Java多线程和并发编程(一/二)
public class ProcessDemo1 { public static void main(String[] args) { while(true) { int a = (int) (Math.random() * 100); System.out.println(" main thread is running " + a); try { Thr...原创 2020-04-29 23:55:49 · 165 阅读 · 0 评论 -
Java多线程信息共享(三)
线程类 粗粒度:子线程与子线程之间,和main线程之间缺乏交流 细粒度:线程之间有信息交流通讯 Java通过共享变量达到信息共享 JDK原生库暂时不支持(点对点的)发送信息(类似MPI并行库直接发送消息) 通过共享变量在多个线程中共享消息 1、static变量(是这个类所有的对象,都共享的一个变量) 注:如果一个线程继承线程类继承Thread类,那么该类的信息共享只能通过static变量实现。...原创 2020-04-30 22:05:51 · 170 阅读 · 0 评论