![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
并发编程
文章平均质量分 66
并发编程
郝开
你可以是一本打开的书,但我要比那复杂一点。
展开
-
JUC:7_2三大辅助类:CylicBarrier原理及使用、线程加法计数器
JUC:7_2三大辅助类:CylicBarrier原理及使用、线程加法计数器JUC:7_1三大辅助类:CountDownLatch原理及使用、线程减法计数器什么是CyclicBarrier?构造方法CountDownLatch 和 CyclicBarrier 的区别:代码JUC:7_1三大辅助类:CountDownLatch原理及使用、线程减法计数器什么是CyclicBarrier?允许一组线程全部等待彼此达到共同屏障点的同步辅助。 循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼原创 2022-03-26 17:40:12 · 546 阅读 · 0 评论 -
JUC:8读写锁:ReadWriteLock、读锁和写锁、共享锁和不加锁的区别
JUC:8读写锁:ReadWriteLock什么是读写锁ReadWriteLock使用场景和注意事项读锁和写锁共享锁和不加锁的区别?代码什么是读写锁ReadWriteLockReadWriteLock是java.util.concurrent.locks 包下的三个接口之一:1.Condition2.Lock3.ReadWriteLock官方文档是这样描述的:ReadWriteLock维护一对关联的locks ,一个用于只读操作,一个用于写入。 read lock可以由多个阅读器线程同时进原创 2022-03-28 00:15:00 · 1153 阅读 · 1 评论 -
JUC:10_1线程池学习:池化技术的产生,线程池的好处,线程池三大方法,创建线程池的几种方式,scheduleAtFixedRate和scheduleWithFixedDelay的区别
JUC:10线程池:池化技术的产生池化技术的产生线程池的好处线程池三大方法:Executors工具类三大方法池化技术的产生程序的运行,会占用系统资源,资源的创建和销毁十分耗时。因此为了避免不停的开关,产生了池化技术,池就是事先准备好一些资源,使用的时候直接拿来用即可,用完之后再返回池,下一个继续使用,完成资源的复用。常见的池: 线程池、数据库连接池、内存池、对象池线程池的好处降低资源的消耗提高响应速度方便管理线程控制最大并发数,防止内存泄漏线程池学习需要掌握的:三大方法、7大参数、四种原创 2022-03-30 00:30:00 · 339 阅读 · 0 评论 -
JUC:10_3线程池最大线程数设置
JUC:10_3线程池最大线程数设置线程池最大线程数设置自定义线程池线程池最大线程数设置线程池怎么设计,需要看你的业务,基本分为两种场景CPU密集型:CPU是几核的就设置几,这样可以保证CPU的效率最高IO密集型:IO操作是十分耗时和占用资源的,因此可以统计系统中的IO任务有多少,然后设置2倍的数值,保证即使IO全部执行,仍有一半线程是可用的Java获取运行环境的CPU核数输出:System.out.println(Runtime.getRuntime().availableProcesso原创 2022-03-31 21:54:21 · 1175 阅读 · 0 评论 -
JUC:11四大原生函数式接口:函数型接口Function、判断型函数接口Predicate、Supplier供给型接口、消费型接口Consumer
JUC:11四大函数式接口Lamda表达式好处、Lamda表达式演变、Lamda表达式使用总结什么是函数式接口四大原生函数式接口Function:函数型接口Function DemoPredicate:判断型接口Predicate DemoSupplier:供给型接口Supplier DemoConsumer:消费型接口Consumer DemoLamda表达式好处、Lamda表达式演变、Lamda表达式使用总结什么是函数式接口有且只有一个抽象方法(public abstract修饰的方法)的接口,可原创 2022-04-02 21:34:29 · 394 阅读 · 0 评论 -
异步回调:CompletableFuture
异步回调:CompletableFutureCompletableFutureFuture设计的初衷,对将来的某个事件的结果进行建模CompletableFuturepublic class CompletableFuture<T>extends Objectimplements Future<T>, CompletionStage<T>Future可以明确地完成(设定其值和状态),并且可以被用作CompletionStage ,支持有关的功能和它的完成时触原创 2022-04-06 21:47:37 · 396 阅读 · 0 评论 -
JUC:2_项目中多线程正确使用方式
JUC:项目中多线程正确使用方式项目中多线程正确使用方式代码问题:未使用同步锁项目中多线程正确使用方式真实多线程开发,为了降低耦合性,并不会新建一个类去继承Thread或者实现Runable这种,那样耦合性太强了编程要符合OOP线程就是一个单独的 资源类 ,没有任何附属操作,它就两个核心1.属性2.方法/** * 真实多线程开发,为了降低耦合性,并不会新建一个类去继承Thread或者实现Runable这种,那样耦合性太强了 * 编程要符合OOP * <p>原创 2022-02-26 06:00:00 · 242 阅读 · 0 评论 -
JUC:6_2解析CopyOnWrite:写入时复制、CopyOnWriteArrayList比Vector好在哪里
JUC:6_2解析CopyOnWrite、CopyOnWriteArrayList比Vector好在哪里什么是解析CopyOnWriteCopyOnWriteArrayList比Vector好在哪里?Vector add源码CopyOnWriteArrayList源码好在哪里?什么是解析CopyOnWriteCopyOnWrite,简称COW,是计算机程序设计领域的一种优化策略多个线程调用的时候,读取的时候是固定的,写入时覆盖,读写分离,写时复制CopyOnWriteArrayList比Vecto原创 2022-03-20 19:23:42 · 496 阅读 · 0 评论 -
JUC:10_2线程池源码分析:线程池七大参数、线程池四大拒绝策略、DiscardOldestPolicy拒绝策略源码分析、线程池最大线程数设置、自定义线程池
JUC:10_2线程池源码分析:Executors七大参数JUC:10_1线程池学习:池化技术的产生、线程池的好处、线程池三大方法Executors源码分析:七大参数七大参数介绍JUC:10_1线程池学习:池化技术的产生、线程池的好处、线程池三大方法Executors源码分析:七大参数// 固定线程数量的线程池:传入的int就是定义核心线程数和最大线程数public static ExecutorService newFixedThreadPool(int nThreads) { r原创 2022-03-30 22:45:50 · 798 阅读 · 0 评论 -
JUC:5锁的种类:synchronized修饰方法锁为例
JUC:5并发协作模型:锁的8种类型1.同一把锁:synchronized修饰的普通方法2.多把锁:synchronized修饰的普通方法3.synchronized修饰的static方法1.同一把锁:synchronized修饰的普通方法标准情况下,两个线程先打印funcA,再funcB:谁先获得锁,谁先输出funA不释放锁的情况下,先打印funcA,载funcB:谁获得锁,谁输出增加一个普通方法(非同步方法),不受锁的影响,正常cpu调度到了输出package juc.lock8;im原创 2022-03-17 07:00:00 · 270 阅读 · 0 评论 -
JUC:4_3并发协作模型:生产者消费者问题:精准唤醒condition、condition应用场景
JUC:4_3并发协作模型:生产者消费者问题:精准唤醒conditionPackage java.util.concurrent.locks接口和类提供了一个框架,用于锁定和等待与内置同步和监视器不同的条件。Condition是原创 2022-03-16 14:13:49 · 960 阅读 · 0 评论 -
JUC:1_基础知识:什么是JUC、进程和线程的区别、Java有几个线程、Java是否真的可以开启线程、并发和并行、Java线程状态、wait和sleep区别
JUC:基础知识:进程和线程的区别、Java有几个线程、Java是否真的可以开启线程、并发和并行、Java线程状态、wait和sleep区别Runable进程和线程的区别Java中的线程需要弄明白的Java有几个线程?Java是否真的可以开启线程?并发和并行Java线程状态:Thread.Statewait和sleep区别来自不同的类关于锁的释放适用范围不同是否需要捕获异常RunableRunable:没有返回值,效率比Callable低,功能也没有Callable强大,没有Callable常用。进程原创 2022-02-25 06:30:00 · 229 阅读 · 0 评论 -
JUC:3_1synchronized锁和Lock锁区别
JUC:3_Lock锁java.util.concurrent.locks.Lock(接口)Lock惯用语java.util.concurrent.locks.Lock(接口)所有已知实现类:ReentrantLockReentrantReadWriteLock.ReadLockReentrantReadWriteLock.WriteLockLock实现提供比使用synchronized方法和语句可以获得的更广泛的锁定操作。 它们允许更灵活的结构化,可能具有完全不同的属性,并且可以支持多个相原创 2022-02-28 07:00:00 · 294 阅读 · 0 评论 -
JUC:6_3Thread、Runnable、Callabale的关系和使用
这里写自定义目录标题什么是CallableRunnableThread、Runnable、Callabale的关系代码什么是Callablepublic interface Callable返回结果并可能引发异常的任务。 实现者定义一个没有参数的单一方法,称为call 。Callable接口类似于Runnable ,因为它们都是为其实例可能由另一个线程执行的类设计的。 然而,Runnable不返回结果,也不能抛出被检查的异常。该Executors类包含的实用方法,从其他普通形式转换为Callable原创 2022-03-22 06:30:00 · 236 阅读 · 0 评论 -
JUC:4_2并发协作模型:生产者消费者问题:if虚假唤醒,防止虚假唤醒
JUC:4_2并发协作模型:生产者消费者问题:if虚假唤醒,防止虚假唤醒线程之间的通信,如何交替执行?一个++一个--来操作两个++和两个--线程同时操作number问题怎么出现的:if和whileobject的wait()为什么要用while来判断?线程之间的通信,如何交替执行?线程A、B操作同一个变量numbe=0/** * 线程之间的通信,如何交替执行 ? * 线程A、B操作同一个变量numbe=0 * A++ * B-- * <p> * 问题: * 1.在只有两个线原创 2022-03-08 07:15:00 · 220 阅读 · 0 评论 -
JUC:6_1集合类并发问题、集合类并发不安全解决方案2:map、set
JUC:6_1集合类并发问题、集合类并发不安全解决方案2:map、set集合类并发不安全解决方案2:map、set代码报错# 集合类并发不安全解决方案1:list集合类并发不安全解决方案2:map、setHashSet的本质就是HashMap,public HashSet() { map = new HashMap<>(); }public boolean add(E e) { return map.put(e, PRESENT)==null;原创 2022-03-21 06:00:00 · 160 阅读 · 0 评论 -
JUC:7_1三大辅助类:CountDownLatch原理及使用、线程减法计数器
JUC:7_1三大辅助类:CountDownLatch原理及使用、线程减法计数器什么是CountDownLatch?代码原理什么是CountDownLatch?允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。A CountDownLatch用给定的计数初始化。 await方法阻塞,直到由于countDown()方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的await 调用立即返回。 这是一个一次性的现象 - 计数无法重置。 如果您需要重置计数的版本,请考虑使原创 2022-03-23 22:17:19 · 501 阅读 · 0 评论 -
JUC:3_2synchronized锁和Lock锁代码
JUC:synchronized锁和Lock锁原创 2022-02-27 10:29:55 · 75 阅读 · 0 评论 -
JUC:7_3三大辅助类:Semaphore信号量
JUC:7_3三大辅助类:Semaphore信号量什么是Semaphore构造方法原理作用代码什么是Semaphore一个计数信号量。 在概念上,信号量维持一组许可证。 如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它。 每个release()添加许可证,潜在地释放阻塞获取方。 但是,没有使用实际的许可证对象; Semaphore只保留可用数量的计数,并相应地执行。信号量通常用于限制线程数,而不是访问某些(物理或逻辑)资源。构造方法Semaphore(int permit原创 2022-03-27 02:30:00 · 216 阅读 · 0 评论 -
JUC:6_1集合类并发问题、集合类并发不安全解决方案1:list
JUC:6集合类并发问题、集合类并发不安全解决方案集合类很多都是并发不安全的测试代码报错集合类很多都是并发不安全的ArrayList(始于jdk1.2)是线程不安全的,有几率会报java.util.ConcurrentModificationExceptio解决方案?1.Vector替换ArrayList2.Collections(集合工具类)提供的将不安全的类转换为安全的类的方法3.JUC提供的读写安全集合类:CopyOnWriteArrayList测试代码package juc.l原创 2022-03-19 20:46:19 · 494 阅读 · 0 评论 -
JUC:9阻塞队列:BlockingQueue与Collection类图关系、队列的特点及什么情况会阻塞、BlockingQueue四组必会API
JUC:9阻塞队列:BlockingQueue与Collection类图关系、队列的特点及什么情况会阻塞、BlockingQueue四组必会API队列的特点及什么情况会阻塞BlockingQueueBlockingQueue、BlockingDeque阻塞队列与Collection类图关系什么时候会用到阻塞队列?BlockingQueue四组必会APIDemo队列的特点及什么情况会阻塞队列的特点:先进先出FIFO(first in first out)队列什么情况下会阻塞?写入:如果队列满了,就必须原创 2022-03-29 01:45:00 · 484 阅读 · 0 评论 -
什么是ForkJoin、ForkJoin分支合并、ForkJoin工作窃取、ForkJoin大数据求和计算
什么是ForkJoin、ForkJoin分支合并、ForkJoin工作窃取、ForkJoin大数据求和计算什么是ForkJoin?ForkJoin:分支合并ForkJoin特点:工作窃取如何让使用ForkJoinForkJoin求和计算Demo什么是ForkJoin?ForkJoin(分支合并)是jdk1.7之后出来的,并行执行任务,提高效率,用在大数据量场景下。大数据:Map Reduce(把大任务拆分成多个小任务,怎么拆分用到了二分算法),每个小任务得出自己的结果,之后再把结果汇总,汇总的过程就是原创 2022-04-05 06:15:00 · 592 阅读 · 0 评论 -
lambda表达式过滤、链式编程、函数式接口、Stream流式计算
lambda表达式、链式编程、函数式接口、Stream流式计算什么是stream流式计算DemoStream方法方法详细信息filtermapmapToIntmapToLongmapToDoubleflatMapflatMapToIntflatMapToLongflatMapToDoubledistinctsortedsortedpeeklimitskipforEachforEachOrderedtoArrayreducereducecollectcollectminmaxcountanyMatchnone原创 2022-04-03 23:55:30 · 535 阅读 · 0 评论 -
Java线程的状态、wait和sleep区别
线程状态观测Thread.StateThread.State线程状态,线程可以处于以下状态之一:NEW:尚未启动的线程处于此状态RUNNABLE:再Java虚拟机中执行的线程处于此状态BLOCKER:被阻塞等待监视器锁定的线程处于此状态WAITING:正在等待另一个线程执行特定动作的线程处于此状态TIMED_WAITING:正在等待另一个线程执行特定动作到达指定时间的线程处于此状态TERMINATED:已退出的线程处于此状态一个线程可以再给定时间点处于一个状态,这些状态是不反应任何操作原创 2022-02-24 06:15:00 · 331 阅读 · 0 评论 -
如何使用线程池
如何使用线程池线程池为什么会出现?Java中提供的线程池相关APIExecutorServiceExecutors测试线程池线程池为什么会出现?背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,会影响性能。思路:提前创建好一定数量的线程,放入线程池,使用时直接获取,使用完放回线程池中。可以避免频繁创建和销毁线程、实现重复利用。好处:提高响应速度(减少了创建线程的时间)降低资源消耗(重复利用线程池中线程,不需要每次创建)便于线程管理corePollSize:核心池大小m原创 2022-02-23 07:00:00 · 381 阅读 · 0 评论 -
并发协作模型:生产者消费者模型 解决方式2.信号灯法
并发协作模型:生产者消费者模型 解决方式2.信号灯法信号灯法代码输出信号灯法并发协作模型"生产者/消费者模式" ===> 信号灯法通过建立标志位,根据标志位来判断是否通知,类似红灯停、绿灯行,什么时候只监听,什么时候允许通过来解决线程通过的方式。代码package testthread.gaoji;/** * 并发协作模型"生产者/消费者模式" ===> 信号灯法 * 通过建立标志位,根据标志位来判断是否通知,类似红灯停、绿灯行,什么时候只监听,什么时候允许通过来解决线原创 2022-02-22 07:00:00 · 285 阅读 · 0 评论 -
并发协作模型:生产者消费者模型 解决方式1.管程法
并发协作模型:生产者消费者模型 解决方式1.管程法管程法代码管程法并发协作模型"生产者/消费者模式" ===> 管程法生产者:负责生产数据的模块(可能是方法、对象、线程、进程)消费者:负责处理数据的模块(可能是方法、对象、线程、进程)缓冲区:消费者不能直接使用生产者的数据,他们之间有个缓冲区生产者将生产好的数据放入缓冲区,消费者从缓冲区拿出数据代码package testthread.gaoji;/** * 测试生产者消费者模型:并发协作模型"生产者/消费者模式" ===>原创 2022-02-21 16:37:13 · 101 阅读 · 0 评论 -
线程协作、线程通信、线程生产者消费者问题
线程协作、线程通信、线程生产者消费者问题线程通信线程生产者消费者问题Java提供了线程通信解决的方法线程生产者消费者问题如何解决?解决方式1:管程法解决方式2:信号灯法线程通信应用场景:线程生产者消费者问题比如生产东西放在仓库里,仓库容量一定,生产者将生产出来的东西放在仓库里,消费者去仓库里取走东西完成消费如果仓库没满,则生产者继续生产东西,满了则停止生产并等待,直到仓库中的产品被消费者取走,使得容量有空闲再继续生产如果仓库中有东西,则消费者将东西拿走并消费,直至仓库空了再停止消费并等待,知道仓原创 2022-02-19 06:45:00 · 172 阅读 · 1 评论 -
Lock锁、ReentrantLock(可重入锁)使用
Lock锁、ReentrantLock可重入锁使用Lock锁ReentrantLock(可重入锁)使用Lock锁jdk 5.0开始,Java提供了更强大的线程同步机制,可以显示定义同步锁对象来实现同步。同步锁使用Lock对象充当。java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前需要先获得Lock对象。ReentrantLock(可重入锁)类原创 2022-02-18 06:00:00 · 492 阅读 · 0 评论 -
什么是死锁
什么是死锁死锁死锁避免方法死锁多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或多个线程都在相互等待对方释放资源,僵持着,都停止执行的情形,某一个同步块同时拥有"两个以上对象的锁"时,就可能发生"死锁"的问题。package com.example.demo.testthread;public class TestDiedLock implements Runnable { private String weapon1; private Strin原创 2022-02-17 07:00:00 · 197 阅读 · 1 评论 -
synchronized
synchronized线程同步同步方法线程同步由于同一进程的多个线程共享同一块存储空间,在带来方便的同时,也带了访问冲突问题,为了保证数据在方法中被访问的正确性,在访问时加入锁机制synchronized,当一个线程获得对象的排它锁,独占资源,其他啊线程必须等待,使用后释放锁即可。产生新的问题:一个线程持有锁会导致其他所有需要此锁的线程挂起在多线程竞争下,加锁,释放锁会导致比较多的上下文切换和调度延时,引起性能问题如果一个优先级高的线程等待一个优先级低的线程释放锁,会导致优先级导致,引起性能原创 2022-02-16 21:54:29 · 138 阅读 · 0 评论 -
线程的优先级
线程的优先级Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行线程的优先级用数字表示,范围从1~10Thread.MIN_PRIORITY=1Thread.MAX_PRIORITY=10Thread.NORM_PRIORITY=5使用以下方式获得和改变线程的优先级getPriority()setPriority(int xxx)优先级高代表抢到CPU时间片的概率大,不一定先执行,我们设置优先级,仅能作为原创 2022-02-14 07:15:00 · 147 阅读 · 0 评论 -
线程休眠、线程休眠应用场景
线程休眠、线程休眠应用场景线程休眠sleep线程休眠的作用模拟网络延时:放大问题的发生性模拟倒计时线程休眠sleepsleep指定当前线程阻塞的毫秒数,1000ms=1ssleep存在异常InterruptedExceptionsleep时间达到后线程进入就绪状态sleep可以模拟网络延时、倒计时等每一个对象都有一个锁,sleep不会释放锁线程休眠的作用模拟网络延时:放大问题的发生性package testthread;//sleep模拟网络延时:放大问题的发生性,模拟抢票的并发问原创 2022-02-13 07:30:00 · 663 阅读 · 0 评论 -
如何正确停止线程
如何正确停止线程如何正确停止线程代码测试如何正确停止线程不推荐使用jdk提供的stop()、destroy()方法。这些是jdk已经废弃的方法。不建议死循环,推荐线程自己停下来。建议使用一个标志位作为线程种植变量,当flag=false,线程停止运行。代码package testthread;public class StopThread implements Runnable { //1.线程中定义线程体使用的终止标识 private Boolean flag = t原创 2022-02-12 07:00:00 · 348 阅读 · 1 评论 -
Lamda表达式好处、Lamda表达式演变、Lamda表达式使用总结
Lamda表达式好处、演变、使用总结使用Lamda表达式的好处Functional Interfere:函数式接口Lamda表达式的演变过程1.一个接口对应多个实现类,造成编写的文件数量很多2.使用内部类定义实现类2.1静态内部类2.2局部内部类2.3匿名内部类3.Lamda表达式3.1Lamda表达式继续简化Lamda表达式使用总结使用Lamda表达式的好处避免匿名内部类定义过多可以让代码看起来更简洁去掉一对无意义的代码,只留下核心逻辑Functional Interfere:函数式接口理原创 2022-02-11 11:02:30 · 1707 阅读 · 0 评论 -
多线程概念及多线程三种创建方式
多线程概念及多线程三种创建方式多线程相关概念创建线程方式1:继承Thread类,重写run(),调用start()开启线程创建线程方式2:实现Runnable接口,重写run(),执行线程需要丢给Runnable接口实现类(Thread类实现了Runnable),调用start开启线程继承Thread和实现Runable对比创建线程方式3:实现Callable接口,带返回值的多线程相关概念线程就是独立的执行路径程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程、gc线程main()称之原创 2022-02-08 06:15:00 · 1797 阅读 · 0 评论 -
html解析图片url,并用继承Thread类的多线程下载
html解析图片url,并用继承Thread类的多线程下载pom依赖Java代码把对应网页的img元素,通过继承Thread类的多线程下载下来。pom依赖<dependencies> <!--实现文件下载--> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId>原创 2022-02-07 15:58:27 · 581 阅读 · 0 评论