![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JUC
文章平均质量分 73
java 技术中JUC并发编程知识总结。
跟着狂神学JUC。
专注写bug
你知道的越多,你不知道的也越多!
展开
-
Java——死锁的产生和分析
文章目录死锁的由来死锁产生的条件demo演示死锁死锁出现原因图谱分析死锁1、jps -l 查看程序执行的进程2、通过 jstack -l pid 查看堆栈内存死锁的由来在实际开发中,并发开发中难免会碰见死锁的问题。出现死锁问题后,程序中的现象为:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。死锁产生的条件1、互斥使用。当资源被一个线程使用(占有)时,别的线程不能使用。2、不可抢占。资源请求者不能强制从资源占有者手中夺取资源,原创 2021-10-09 11:07:38 · 163 阅读 · 0 评论 -
Springboot——自定义线程池并使用
文章目录关于线程池Spring自定义线程池请求测试关于线程池不熟悉线程池的玩法,可以先看我之前的几篇博客,了解JUC中的线程池的定义,各个参数含义,以及玩法。JUC之线程池JUC之线程池七大参数理解JUC之线程池问题补充Spring自定义线程池既然放入Spring中,依靠Spring来管理线程池的生命周期。当然也需要注意使用单例,如果使用多例,和直接new Thread又有什么区别。import org.springframework.context.annotation.Bean;imp原创 2021-04-14 20:22:18 · 4274 阅读 · 0 评论 -
JUC——Atomic原子性操作
文章目录volatile 可见性volatile 不保证原子性atomic原子操作volatile 可见性volatile 可以保证线程执行的可见性。什么是可见性?某个线程变更某条数据后,通知其他线程,告知数据更改!具体的原理可以参考我的另外一篇博客:volatile关键字(一)volatile 不保证原子性但是,volatile并不保证原子性。什么是原子性?一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。原子性就像数据库里面的事务一样,他们是一原创 2021-04-07 17:07:07 · 208 阅读 · 0 评论 -
JUC——Feature异步任务
文章目录前言JDK 1.8 文档无返回值Demo有返回值Demo前言在服务器开发中,有异步、同步的概念。在JUC中同样存在。JDK 1.8 文档无返回值Demopackage feature;import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;import java.util.concurrent.TimeUnit;/** * 异步调用(无返回值原创 2021-04-07 15:44:56 · 417 阅读 · 1 评论 -
JUC——ForkJoin线程池(递归操作)
文章目录什么是ForkJoin有什么特点使用Demo什么是ForkJoinForkJoin 是JDK 1.7引入的一种新的线程池,其本意应该是Fork / Join。他能将大任务拆分成小任务进行运算,最后将结果合并。其原理如下所示:有什么特点具有工作窃取的特点。什么是工作窃取呢?假设存在A和B两个线程。当A线程执行到此处时,B线程已经执行完毕。此时的B线程不会继续等待,会从A线程操作的双端队列中,窃取任务继续执行。提高效率。使用Demo假设有这么一道需求:计算1~10原创 2021-04-05 20:06:34 · 632 阅读 · 1 评论 -
Stream——流式计算
文章目录前言Demo操作前言在互联网的开发中,往往都离不开存储和计算操作。在程序中,存储方式分为很多种类,如Java中的集合、数据库、Redis等。计算应该由流来操作。Demo操作假设有这个一个User类,如下所示:package demo7;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@NoArgsConstructor //无参构造@AllAr原创 2021-04-04 18:15:30 · 195 阅读 · 1 评论 -
JUC之线程池问题补充
文章目录问题1:何时开启 maximumPoolSize问题2:为什么等队列满才开启 maximumPoolSize问题1:何时开启 maximumPoolSize在之前博客JUC之线程池七大参数理解中有说到:1、当corePoolSize 核心数达到上限时,此时新的操作数据,会保存至队列中。2、当队列中的存储也满的时候,才会开启maximumPoolSize - corePoolSize部分。问题2:为什么等队列满才开启 maximumPoolSize说明这个问题之前,需要明白两个概念:原创 2021-03-23 23:57:33 · 164 阅读 · 1 评论 -
JDK 1.8 —— 函数式接口和Lambda表达式
文章目录前言四大函数式接口Function 函数式Predicate 断定性函数Consumer 消费者函数Supplier 供给式函数前言在jdk 1.8之前,可以针对接口采取匿名内部类的方式,实例化出来。在jdk 1.8 及以后可以采取Lambda表达式实现。只要是函数式接口,都能使用Lambda表达式简化代码。四大函数式接口参考开发文档中java.util.function。Function 函数式其特性如源码所示:1、由@FunctionalInterface修饰,表示该接口中有原创 2021-03-22 20:26:22 · 179 阅读 · 0 评论 -
JUC之线程池七大参数理解
Created with Raphaël 2.2.0开始框是否校验tokentoken是否有效token中获取userIduser = findByUserId(userId)user对象是否为空auth = @authorityCheck.getValue()apiId = findApi(auth).getIdfindCount(apiId + userId) > 0 ? yes : noerror结束框yesnoyesnoyesnono...原创 2021-03-22 17:49:47 · 329 阅读 · 0 评论 -
JUC之线程池
文章目录为什么会有线程池?线程池的创建(3大方法)newSingleThreadExecutor()newFixedThreadPool(..)newCachedThreadPool()7大参数4种拒绝策略AbortPolicyCallerRunsPolicyDiscardPolicyDiscardOldestPolicy自定义线程池AbortPolicy 超过最大容载抛出异常CallerRunsPolicy超过最大容载交给来源DiscardPolicy超过最大容载直接舍弃DiscardOldestPoli原创 2021-03-22 16:47:10 · 430 阅读 · 1 评论 -
JUC之SynchronousQueue同步队列
文章目录结构图SynchronousQueue 简介SynchronousQueue 测试案例结构图SynchronousQueue 简介大小只有1个;属于同步队列;必须等待添加的元素取出才会继续添加,否则一直等待。SynchronousQueue 测试案例验证上面所描述的特性,下面编写代码观察结果:1、持续添加3个数据信息至 SynchronousQueue 中。2、读取操作采取延迟读取的方式。3、观察日志信息。package demo5_4;import java.原创 2021-03-22 15:11:19 · 152 阅读 · 0 评论 -
JUC之BlockingQueue阻塞队列
文章目录BlockingQueue介绍什么是阻塞队列ArrayBlockingQueue异常抛出(add、remove)无异常抛出(offer、poll)期限等待(offer(...)、poll(..))阻塞等待(死等)(put、take)关于获取队首元素关于add和remove的异常关于offer和poll无异常BlockingQueue介绍Collection下的子接口。其主体结构图如下所示:什么是阻塞队列这个名词包含两种含义,一种是队列,一种是阻塞。队列:如上所示,队列就是一种排队样原创 2021-03-21 19:34:59 · 162 阅读 · 2 评论 -
JUC下的读写锁 ReadWriteLock
文章目录前言简介案例无锁情况下使用 ReentrantLock 加锁ReentrantReadWriteLock 读写锁前言代码中,针对加锁的区块,多线程执行调用时,会根据先获取到锁先执行,其他线程必须等待其成功释放锁后才能继续使用资源。整体而言虽然保证了数据的完整性,但是对于效率来说,会有所降低。针对此问题,在JUC包下存在一个读写锁类ReadWriteLock。简介ReadWriteLock在java中是一个接口。有且仅有一个官方定义的子类java.util.concurrent.locks.原创 2021-03-21 15:56:12 · 206 阅读 · 4 评论 -
JUC下的辅助工具类
文章目录前言CountDownLatch 减法计数器CyclicBarrier 加法计数器Semaphore 信号量前言再java.util.concurrent包下,存在有几个辅助操作工具类。如CountDownLatch 减法计数器、CyclicBarrier 加法计数器和Semaphore 信号量。刚听到这几个类,很懵,下面就来说说这三个工具类具体怎么来用。CountDownLatch 减法计数器给定初始大小容量,每次线程进行某项操作时调用,容量-1,等待其中无数据时,继续执行其他操作。原创 2021-03-17 17:54:46 · 169 阅读 · 2 评论 -
Callable
文章目录前言Callable的诞生简单案例为什么需要FutureTask获取返回值一个小坑前言前面的博客中,分别说明了线程启动的几种方式以及常用的集合安全替换。有兴趣的可以查看:JUC 专栏说到线程的创建,常见的有Thread类和Runnable接口两种方式实现。Thread类:Thrad定义线程的对象。线程start启动、sleep睡眠、wait等待、通知notify等的实现类。其底层采取调用C++代码逻辑实现主要功能。Runnable接口:Runnable在线程中,属于线程的主体。原创 2021-03-15 20:49:53 · 543 阅读 · 3 评论 -
JUC中的Map安全类集合
文章目录原创 2021-03-14 13:58:25 · 414 阅读 · 1 评论 -
JUC中的Set安全类集合
文章目录前言为什么多线程下的普通set集合不安全Collections下的安全集合JUC下的安全Set集合前言set集合在java中本质上是无序的,关于为什么会无序,在底层源码中有很详细的说明。本质上依旧还是一个 HashMap 集合,其中保存数据的方式为保存至key中。关于更加详细的为什么是无序,可以参考另外一篇博客内容(java源码—hashmap源码分析(jdk1.8)),这里不做过多的阐述。为什么多线程下的普通set集合不安全如标题所述,为什么在多线程执行条件下,set集合存在不安全原创 2021-03-13 18:46:03 · 343 阅读 · 0 评论 -
JUC中的List安全类集合
文章目录简介集合ListSetMap简介集合ListSetMap原创 2021-03-13 18:28:42 · 1256 阅读 · 2 评论 -
易混淆的锁知识
文章目录前言狂神说的八锁狂神代码和理解分析1、synchronized锁方法的调用者(单资源)2、同时存在锁和不锁的打印情况(单资源)3、多资源调用不同加锁方法4、static修饰带synchronized的方法(单资源)5、多资源调用static修饰的synchronized方法6、同时存在static锁和正常锁(单资源)7、多资源消费同时存在static锁和正常锁前言跟着狂神学JUC,结合狂神提出的关于锁的几点易混淆的知识方面,结合自己的理解,写一些自己的心得体会。狂神说的八锁八锁现象狂神代码原创 2021-03-12 16:17:53 · 130 阅读 · 0 评论 -
生产者和消费者造成wait()虚假唤醒问题
文章目录生产者和消费者问题多个消费者消费同一生产者数据问题多个线程造成的问题分析问题根源生产者和消费者问题创建生产者和消费者,使用两个线程去操作同一个资源!package demo2;public class Test { public static void main(String[] args) { // 使用多线程,操作同一个类 Data data = new Data(); // 线程A 负责增加 new Thread原创 2021-03-10 17:01:22 · 552 阅读 · 0 评论 -
java.util.concurrent.locks.Lock锁
文章目录Lock(锁)synchronized和Lock的区别Lock(锁)先看一个简单的卖票例子(无锁):package demo1;public class SaleTicketTest { public static void main(String[] args) { // lambda 表达式 ()表示run() 其中"()"中可以写明参数 ,->{} 表示 run后的代码块{} // 支持 lambda 表达式,必须是接口上有 @Funct原创 2021-03-09 21:03:08 · 980 阅读 · 0 评论 -
线程、进程等知识总结
文章目录进程和线程Java中有几个线程?Java 可以开启线程?并发和并行线程的状态wait()、sleep()的区别Lock(锁)进程和线程进程进程是一个程序的集合。比如运行中的QQ、微信等,在运行时,就存在进程。一个进程,可以包含多个线程。(一个进程至少包含一个线程。)线程在一个应用中,程序执行流的最小单元。上面的说法过于抽象,举个栗子:火车 == 进程车厢 == 线程火车和火车是不同的进程。但是一列火车,可以包含多个车厢。Java中有几个线程?默认两个。一原创 2021-03-09 20:42:04 · 99 阅读 · 0 评论