
Java高并发学习专栏
文章平均质量分 86
GitHub质检员
目前专注于大学生项目实战开发,讲解,毕业答疑辅导以及产品测评、宣传、工具推广等合作。全网粉丝30万+,CSDN特邀博主,Java新星计划多届导师,掘金/知乎/华为云/阿里云/51CTO等平台优质创作者。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
java高并发系列 - 第34篇:google提供的一些好用的并发工具类
通过guava提供的一些工具类,方便异步执行任务并进行回调guava内部还有很多好用的工具类,有兴趣的可以去研究一下。原创 2023-09-03 11:45:21 · 224 阅读 · 0 评论 -
java并发系列 - 第28天:实战篇,微服务日志的伤痛,一并帮你解决掉
日志监控报警是非常重要的,这个必须要有,日志系统中需要开发监控报警功能,这块我们可以做成通过页面配置的方式,支持报警规则的配置,如日志中产生了某些异常、接口响应时间大于多少、接口返回状态码404等异常信息的时候能够报警,具体的报警可以是语音电话、短信通知、钉钉机器人报警等等,这些也做成可以配置的。多个服务之间日志追踪的问题:当一个请求过来的时候,在入口处生成一个trace_id,然后放在ThreadLocal中,如果内部设计到多个服务之间相互调用,调用其他服务的时,将trace_id顺便携带过去。原创 2023-09-02 13:26:51 · 95 阅读 · 0 评论 -
java高并发系列 - 第31天:获取线程执行结果,这6种方法你都知道?
结合这个需求,我们使用,来对之前学过的知识点做一个回顾,加深记忆。原创 2023-09-02 13:27:10 · 1546 阅读 · 0 评论 -
java高并发系列 - 第32天:高并发中计数器的实现方式有哪些?
LongAccumulator是LongAdder的功能增强版。原创 2023-09-03 11:45:11 · 1197 阅读 · 0 评论 -
java高并发系列 - 第33篇:怎么演示公平锁和非公平锁?
公平锁和非公平锁体现在别人释放锁的一瞬间,如果前面已经有排队的,新来的是否可以插队,如果可以插队表示是非公平的,如果不可用插队,只能排在最后面,是公平的方式。原创 2023-09-03 11:45:17 · 101 阅读 · 0 评论 -
java并发系列 - 第29天:高并发中常见的限流方式
从原理上看,令牌桶算法和漏桶算法是相反的,一个“进水”,一个是“漏水”。并发控制的,通俗解释:一大波人去商场购物,必须经过一个门口,门口有个门卫,兜里面有指定数量的门禁卡,来的人先去门卫那边拿取门禁卡,拿到卡的人才可以刷卡进入商场,拿不到的可以继续等待。以秒杀业务为例,10个iphone,100万人抢购,100万人同时发起请求,最终能够抢到的人也就是前面几个人,后面的基本上都没有希望了,那么我们可以通过控制并发数来实现,比如并发数控制在10个,其他超过并发数的请求全部拒绝,提示:秒杀失败,请稍后重试。原创 2023-09-02 13:26:55 · 137 阅读 · 0 评论 -
java并发系列 - 第30天:JUC中工具类CompletableFuture,必备技能
是java8中新增的一个类,算是对Future的一种增强,用起来很方便,也是会经常用到的一个工具类,熟悉一下。原创 2023-09-02 13:27:00 · 116 阅读 · 0 评论 -
java高并发系列 - 第26篇:学会使用JUC中常见的集合,常看看!
这是java高并发系列第26篇文章。环境:jdk1.8。原创 2023-09-02 13:26:40 · 106 阅读 · 0 评论 -
java高并发系列 - 第27天:实战篇,接口性能提升几倍原来这么简单
对于无依赖的操作尽量采用并行方式去执行,可以很好的提升接口的性能大家可以在你们的系统中试试这种方法,感受一下效果,会让你感觉很爽。原创 2023-09-02 13:26:45 · 85 阅读 · 0 评论 -
java高并发系列 - 第25天:掌握JUC中的阻塞队列
重点需要了解中的所有方法,以及他们的区别重点掌握DelayQueue的使用场景需要处理的任务有优先级的,使用处理的任务需要延时处理的,使用DelayQueue。原创 2023-09-02 13:26:31 · 71 阅读 · 0 评论 -
java高并发系列 - 第24天:ThreadLocal、InheritableThreadLocal(通俗易懂)
java高并发系列第24篇文章。环境:jdk1.8。原创 2023-09-02 13:26:22 · 131 阅读 · 0 评论 -
java高并发系列 - 第23天:JUC中原子类,一篇就够了
什么是原子操作?atomic翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰,所以,所谓原子类说简单点就是具有原子操作特征的类,原子操作类提供了一些修改数据的方法,这些方法都是原子操作的,在多线程情况下可以确保被修改数据的正确性。JUC中对原子操作提供了强大的支持,这些类位于。原创 2023-09-02 13:26:08 · 202 阅读 · 0 评论 -
java高并发系列 - 第22天:JUC底层工具类Unsafe,高手必须要了解
最近我们一直在学习java高并发,java高并发中主要涉及到类位于java.util.concurrent包中,简称juc,juc中大部分类都是依赖于Unsafe来实现的,主要用到了Unsafe中的CAS、线程挂起、线程恢复等相关功能。所以如果打算深入了解JUC原理的,必须先了解一下Unsafe类。原创 2023-09-02 13:26:02 · 90 阅读 · 0 评论 -
java高并发系列 - 第21天:java中的CAS,你需要知道的东西
这是java高并发系列第21篇文章。原创 2023-09-02 13:25:55 · 80 阅读 · 0 评论 -
java高并发系列 - 第20天:JUC中的Executor框架详解2
这是java高并发系列第20篇文章。原创 2023-09-02 13:25:50 · 65 阅读 · 0 评论 -
java高并发系列 - 第19天:JUC中的Executor框架详解1
Executors框架是Doug Lea的神作,通过这个框架,可以很容易的使用线程池高效地处理并行任务。Runnable接口或Callable接口任务的执行相关的:包含任务执行机制的核心接口Executor,以及继承自Executor的接口。Executor框架中有两个关键的类实现了ExecutorService接口(和异步计算结果相关的:包含接口Future和实现Future接口的FutureTask类ExecutorExecutorsFutureCallableFutureTask。原创 2023-09-02 13:25:43 · 133 阅读 · 0 评论 -
java高并发系列 - 第18天:JAVA线程池,这一篇就够了
大家用jdbc操作过数据库应该知道,操作数据库需要和数据库建立连接,拿到连接之后才能操作数据库,用完之后销毁。数据库连接的创建和销毁其实是比较耗时的,真正和业务相关的操作耗时是比较短的。每个数据库操作之前都需要创建连接,为了提升系统性能,后来出现了数据库连接池,系统启动的时候,先创建很多连接放在池子里面,使用的时候,直接从连接池中获取一个,使用完毕之后返回到池子里面,继续给其他需要者使用,这其中就省去创建连接的时间,从而提升了系统整体的性能。原创 2023-09-02 13:25:38 · 136 阅读 · 0 评论 -
java高并发系列 - 第17天:JUC中的循环栅栏CyclicBarrier的6种使用场景
CyclicBarrier通常称为循环屏障。它和CountDownLatch很相似,都可以使线程先等待然后再执行。不过CountDownLatch是使一批线程等待另一批线程执行完后再执行;而CyclicBarrier只是使等待的线程达到一定数目后再让它们继续执行。每调用一次await()方法都将使阻塞的线程数+1,只有阻塞的线程数达到设定值时屏障才会打开,允许阻塞的所有线程继续执行。原创 2023-09-02 13:25:31 · 356 阅读 · 0 评论 -
java高并发系列 - 第13天:JUC中的Condition对象
java高并发系列 - 第12天JUC:ReentrantLock重入锁。任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait()、wait(long timeout)、wait(long timeout, int nanos)与notify()、notifyAll()几个方法实现等待/通知机制,同样的, 在java Lock体系下依然会有同样的方法实现等待/通知机制。从整体上来看。原创 2023-09-01 10:55:09 · 74 阅读 · 0 评论 -
java高并发系列 - 第15天:JUC中的Semaphore(信号量)
Semaphore(信号量)为多线程协作提供了更为强大的控制方法,前面的文章中我们学了synchronized和重入锁ReentrantLock,这2种锁一次都只能允许一个线程访问一个资源,而信号量可以控制有多少个线程可以访问特定的资源。举个例子:比如有个停车场,有5个空位,门口有个门卫,手中5把钥匙分别对应5个车位上面的锁,来一辆车,门卫会给司机一把钥匙,然后进去找到对应的车位停下来,出去的时候司机将钥匙归还给门卫。原创 2023-09-01 10:55:19 · 118 阅读 · 0 评论 -
java高并发系列 - 第16天:JUC中等待多线程完成的工具类CountDownLatch,必备技能
CountDownLatch称之为闭锁,它可以使一个或一批线程在闭锁上等待,等到其他线程执行完相应操作后,闭锁打开,这些等待的线程才可以继续执行。确切的说,闭锁在内部维护了一个倒计数器。通过该计数器的值来决定闭锁的状态,从而决定是否允许等待的线程继续执行。常用方法::构造方法,count表示计数器的值,不能小于0,否者会报异常。:调用await()会让当前线程等待,直到计数器为0的时候,方法才会返回,此方法会响应线程中断操作。原创 2023-09-01 10:55:22 · 93 阅读 · 0 评论 -
java高并发系列 - 第14天:JUC中的LockSupport工具类,必备技能
LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程。主要是通过park()和方法来实现阻塞和唤醒线程的操作的。每个线程都有一个许可(permit),permit只有两个值1和0,默认是0。当调用unpark(thread)方法,就会将thread线程的许可permit设置成1(注意多次调用unpark方法,不会累加,permit值还是1当调用park()方法,如果当前线程的permit是1,那么将permit设置为0,并立即返回。原创 2023-09-01 10:55:14 · 82 阅读 · 0 评论 -
java高并发系列 - 第12天JUC:ReentrantLock重入锁
ReentrantLock可以实现公平锁和非公平锁ReentrantLock默认实现的是非公平锁ReentrantLock的获取锁和释放锁必须成对出现,锁了几次,也要释放几次释放锁的操作必须放在finally中执行lockInterruptibly()实例方法可以相应线程的中断方法,调用线程的interrupt()方法时,lockInterruptibly()方法会触发异常关于异常说一下,看到方法声明上带有,表示该方法可以相应线程中断,调用线程的interrupt()方法时,这些方法会触发。原创 2023-09-01 10:50:31 · 98 阅读 · 0 评论 -
java高并发系列 - 第11天:线程中断的几种方式
当一个线程处于被阻塞状态或者试图执行一个阻塞操作时,可以使用方式中断该线程,注意此时将会抛出一个的异常,同时中断状态将会被复位(由中断状态改为非中断状态)内部有循环体,可以通过一个变量来作为一个信号控制线程是否中断,注意变量需要volatile修饰文中的几种方式可以结合起来灵活使用控制线程的中断。原创 2023-09-01 10:48:25 · 74 阅读 · 0 评论 -
java高并发系列 - 第10天:线程安全和synchronized关键字
当多个线程去访问同一个类(对象或方法)的时候,该类都能表现出正常的行为(与自己预想的结果一致),那我们就可以所这个类是线程安全的。看一段代码:/*** 微信公众号:路人甲Java,专注于java技术分享(带你玩转 爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!t1.start();t2.start();t3.start();原创 2023-09-01 10:47:50 · 72 阅读 · 0 评论 -
java高并发系列 - 第9天:用户线程和守护线程
dameon的默认值为为父线程的daemon,也就是说,父线程如果为用户线程,子线程默认也是用户现场,父线程如果是守护线程,子线程默认也是守护线程。t1是由主线程(main方法所在的线程)创建的,main线程是t1的父线程,所以t1.daemon为false,说明t1是用户线程。可以看到主线程已经结束了,但是程序无法退出,原因:子线程1是用户线程,内部有个死循环,一直处于运行状态,无法结束。java线程分为用户线程和守护线程,线程的daemon属性为true表示是守护线程,false表示是用户线程。原创 2023-09-01 10:46:56 · 150 阅读 · 0 评论 -
java高并发系列 - 第8天:线程组
多说几句,建议大家再创建线程或者线程组的时候,给他们取一个有意义的名字,对于计算机来说,可能名字并不重要,但是在系统出问题的时候,你可能会去查看线程堆栈信息,如果你看到的都是t1、t2、t3,估计自己也比较崩溃,如果看到的是httpAccpHandler、dubboHandler类似的名字,应该会好很多。方法可以返回线程组中的所有活动线程数,包含下面的所有子孙节点的线程,由于线程组中的线程是动态变化的,这个值只能是一个估算值。使用线程组可以方便管理线程,线程组提供了一些方法方便方便我们管理线程。原创 2023-09-01 10:46:17 · 86 阅读 · 0 评论 -
java高并发系列 - 第7天:volatile与Java内存模型
从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。线程t1的run()方法中有个循环,通过flag来控制循环是否结束,主线程中休眠了1秒,将flag置为false,按说此时线程t1会检测到flag为false,打印“线程t1停止了”,为何和我们期望的结果不一样呢?首先,线程A把本地内存A中更新过的共享变量刷新到主内存中去。原创 2023-09-01 10:45:46 · 65 阅读 · 0 评论 -
java高并发系列 - 第6天:线程的基本操作
t4会获取到obj的锁,然后执行notify()方法,系统会从q1队列中随机取一个线程,将其加入到q2队列,假如t2运气比较好,被随机到了,然后t2进入了q2队列,如图4,进入q2的队列的锁才有资格争抢obj的锁,t4线程执行完毕之后,会释放obj的锁,此时队列q2中的t2会获取到obj的锁,然后继续执行,执行完毕之后,q1中包含t1、t3,q2队列为空,如图5。很多时候,一个线程的输入可能非常依赖于另外一个或者多个线程的输出,此时,这个线程就需要等待依赖的线程执行完毕,才能继续执行。原创 2023-09-01 10:44:41 · 82 阅读 · 0 评论 -
java并发系列第5天-深入理解进程和线程
一般来说,WAITING的线程正式在等待一些特殊的事件,比如,通过wait()方法等待的线程在等待notify()方法,而通过join()方法等待的线程则会等待目标线程的终止。我们经常使用windows系统,经常会看见.exe后缀的文件,双击这个.exe文件的时候,这个文件中的指令就会被系统加载,那么我们就能得到一个关于这个.exe程序的进程。线程是轻量级的进程,是程序执行的最小单元,使用多线程而不是多进程去进行并发程序的设计,是因为线程间的切换和调度的成本远远小于进程。5.线程就好比车间里的工人。原创 2023-09-01 10:42:16 · 68 阅读 · 0 评论 -
java高并发系列 - 第4天:JMM相关的一些概念
对于串行程序来说,根本就是小菜一碟,如果你读取一个变量,这个变量的值是1,那么你读取到的一定是1,就是这么简单的问题在并行程序中居然变得复杂起来。如果线程对变量的操作没有刷写回主内存的话,仅仅改变了自己的工作内存的变量的副本,那么对于其他线程来说是不可见的。而如果另一个变量没有读取主内存中的新的值,而是使用旧的值的话,同样的也可以列为不可见。所以必须保证这3个操作是原子性的,在操作a++的过程中,其他线程不会改变a的值,如果在上面的过程中出现其他线程修改了a的值,在满足原子性的原则下,上面的操作应该失败。原创 2023-09-01 10:41:35 · 77 阅读 · 0 评论 -
java高并发系列-第2天:并发级别
如果线程之间是有优先级的,那么线程调度的时候总是会倾向于先满足高优先级的线程。但如果锁是公平的,按照先来后到的规则,那么饥饿就不会产生,不管新来的线程优先级多高,要想获得资源,就必须乖乖排队,这样所有的线程都有机会执行。如果说阻塞的控制方式是悲观策略,也就是说,系统认为两个线程之间很有可能发生不幸的冲突,因此以保护共享数据为第一优先级,相对来说,非阻塞的调度就是一种乐观的策略。在无锁的情况下,所有的线程都能尝试对临界区进行访问,但不同的是,无锁的并发保证必然有一个线程能够在有限步内完成操作离开临界区。原创 2023-09-01 10:31:59 · 73 阅读 · 0 评论 -
java高并发系列-第3天:有关并行的两个重要定律
m2内部的4个任务无依赖的,即可以并行进行处理,4个任务同时并行,当cpu数量大于等于4的时候,可以让4个任务同时进行,此时m2耗时最小,即100ms,cpu为2个的时候,同时只能够执行2个任务,其他2个任务处于等待cpu分配时间片状态,此时m2耗时200ms;需要从根本上修改程序的串行行为,提高系统内可并行化的模块比重,在此基础上,合理增加并行处理器数量,才能以最小的投入,得到最大的加速比。根据Gustafson定律,我们可以更容易地发现,如果串行化比例很小,并行化比例很大,那么加速比就是处理器的个数。原创 2023-09-01 10:33:30 · 67 阅读 · 0 评论 -
java高并发系列-第1天:必须知道的几个概念
你已经支付完成,想干什么就能去干什么,出去溜几圈都不成问题,等送货上门的时候,接到商家的电话,回家一趟签收就完事了。实际上,如果系统内只有一个CPU,而使用多进程或者多线程任务,那么真实环境中这些任务不可能是真实并行的,毕竟一个CPU一次只能执行一条指令,在这种情况下多进程或者多线程就是并发的,而不是并行的(操作系统会不停地切换多任务)。在并行程序中,临界区资源是保护的对象,如果意外出现打印机同时执行两个任务的情况,那么最有可能的结果就是打印出来的文件是损坏的文件,它既不是小王想要的,也不是小明想要的。原创 2023-08-31 10:07:42 · 82 阅读 · 0 评论