![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程与高并发
文章平均质量分 67
蓝天⊙白云
这个作者很懒,什么都没留下…
展开
-
CompletableFuture实现异步编排全面分析和总结
异步回调方法可以选择是否传递线程池参数Executor,这里为了实现线程池隔离,当不传递线程池时,默认会使用ForkJoinPool中的公共线程池CommonPool,这个线程池默认创建的线程数是CPU的核数,如果所有的异步回调共享一个线程池,核心与非核心业务都竞争同一个池中的线程,那么一旦有任务执行一些很慢的I/O 操作,就会导致线程池中所有线程都阻塞在I/O操作上,很容易成为系统瓶颈,影响整个系统的性能。因此, 建议强制传线程池,且根据实际情况做线程池隔离,减少不同业务之间的相互干扰。转载 2024-03-22 17:31:57 · 185 阅读 · 0 评论 -
JUC---FolkJoinPool
1. FolkJoinPool概念该线程池主要用来分叉任务再汇总任务处理,提高处理速度;每个任务都有自己的任务队列;线程池采用了分而治之的编程思想。流程编程中的parallelStream内部就使用了forkJoinPool来实现;2. invoke方法和execute方法区别execute方法开启异步执行,没有返回值,执行结束后也无法获知;Invoke方法有返回值,即等待线程结束返回;3. 使用例子(1)RecursiveAction无返回值任务import java.io.IOExcep原创 2022-04-16 23:50:04 · 367 阅读 · 0 评论 -
Java线程池七个参数详解(转载)
java多线程开发时,常常用到线程池技术,这篇文章是对创建java线程池时的七个参数的详细解释。 从源码中可以看出,线程池的构造函数有7个参数,分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。下面会对这7个参数一一解释。 一、corePoolSize 线程池核心线程大小 线程池中会维护一个...转载 2022-02-18 11:00:39 · 1841 阅读 · 0 评论 -
Java命令学习系列—Jstack命令(转载)
jstack是java虚拟机自带的一种堆栈跟踪工具1. 功能jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java s转载 2022-01-26 16:58:07 · 983 阅读 · 0 评论 -
JUC---LockSupport
1. LockSupport原理LockSupport是一个编程工具类,主要是为了阻塞和唤醒线程用的。LockSiupport的核心方法有两个,park和unpark,park用来阻塞当前调用线程,unpark用来唤醒指定线程。LockSupport类使用了一种名为Permit(许可)的概念来做到阻塞和唤醒线程的功能,可以把许可看成是一种(0,1)信号量(Semaphore),但与 Semaphore 不同的是,许可的累加上限是1。初始时,permit为0,当调用unpark()方法时,线程的per原创 2021-06-07 11:03:54 · 218 阅读 · 0 评论 -
JUC---Exchanger
Exchanger原理介绍Exchanger用于线程间的通信和数据交换;它提供了一个exchange方法,两个线程调用exchange方法时,线程1先调用该方法会进入阻塞状态,直到线程2调用该方法,然后安全交换数据,之后两个线程继续运行。应用场景之一:游戏中玩家之间直接交易物品。Exchanger的原理是使用了ThreadLocal来实现的,至于线程阻塞的部分是使用java中的Usafe类park()/unpark()来实现的。...原创 2021-06-07 09:17:18 · 184 阅读 · 0 评论 -
JUC---Semaphore
边学习,边记录,每天进步一点点。Semaphore原理理解Semaphore字面意思是信号量,在JUC中Semaphore是一个线程同步的辅助类,可以维护当前访问自身的线程数量,并且提供了同步机制。使用Semaphore可以起到限流的作用。常用API(1)Semaphore(int permits)Semaphore的构造函数,用来初始化信号通道数量。(2)acquire(int permits)表示每次线程进入将会占用的通道数量;(3)release归还n个通道,没有原创 2021-06-07 08:59:36 · 176 阅读 · 0 评论 -
JUC---StampedLock
1. StampedLock理解ReadWriteLock只允许有一个线程执行写操作,如果有其它线程正在读,必须等待读线程结束,才可以写;即读锁时悲观的,并发效率依然不是很高。StampedLock是不可重入锁,ReadWriteLock可重入。ReadWriteLock 支持两种模式:写锁读锁StampedLock 支持三种模式:写锁悲观读锁乐观读tryOptimisticRead前者的写锁和和读锁与后者的写锁和悲观读锁类似。即只允许一个线程获得写锁,多个线程获得读锁,读写锁之原创 2021-06-04 14:34:17 · 101 阅读 · 0 评论 -
JUC---ReadWriteLock
边学习,边记录,每天进步一点点。1. ReadWriteLock理解ReadWriteLock读写锁,一个是只读的锁,一个是写锁。读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的。读写锁比互斥锁允许对于共享数据更大程度的并发。每次只能有一个写线程,但是同时可以有多个线程并发地读数据。ReadWriteLock适用于读多写少的并发情况。读写锁的实现必须确保写操作对读操作的内存影响。换句话说,一个获得了读锁的线程必须能看到前一个释放的写锁所更新的内容,读写锁之间为互斥。ReetrantRead原创 2021-06-04 13:53:16 · 140 阅读 · 0 评论 -
JUC---CyclicBarrier
边学习,边记录,每天进步一点点。1. CyclicBarrier理解CyclicBarrier字面意思是“可重用的栅栏”,它一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点。CyclicBarrier 是 ReentrantLock 和 Condition 的组合使用。先定义CyclicBarrier拦截的线程数量(parties)和剩余线程数量(count),初始状态parties = count,然后启动多个线程,当某个线程执行完之后,就加锁,然后count减1,如果发现count原创 2021-06-04 10:26:04 · 106 阅读 · 0 评论 -
JUC---CountDownLatch
边学习,边记录,每天进步一点点。1. CountDownLatch理解CountDownLatch的本质也是一个"共享锁",允许其他线程完成操作之前,一个或多个线程一直等待。CountDownLatch在多线程并发编程中充当一个计时器的功能,并且维护一个count的变量,并且其操作都是原子操作,该类主要通过countDown()和await()两个方法实现功能的,首先通过建立CountDownLatch对象,并且传入参数即为count初始值。如果一个线程调用了await()方法,那么这个线程便进入阻原创 2021-06-04 09:52:01 · 112 阅读 · 0 评论 -
JUC---ReentrantLock
边记录,边学习,每天进步一点点。ReentrantLock可重入锁,基于AQS,可以等同于synchronized使用;它提供了更强大、灵活的锁机制。ReentrantLock还提供了公平锁与非公平锁机制,可以通过构造函数来指定,默认为非公平锁。公平锁的锁获取是有序的,但在效率上不及非公平锁高。...原创 2021-06-03 14:48:25 · 86 阅读 · 0 评论 -
Java Synchronized类锁和对象锁
类锁(类对象.class):synchronized关键字修饰static方法时,无论多线程访问单个对象还是多个对象的synchronized同步块,都是同步的。因为静态方法是所有实例共享的。对象锁(类对象实例):synchronized关键字修饰非静态方法,在多线程访问同一对象实例(可以理解为对该对象的内存加锁)时,才是同步的,访问不同对象就不是同步的,因为不同对象会有不同的内存。类锁和对象锁是不同的锁,可以同时使用,避免嵌套使用发生死锁。...原创 2021-05-29 20:43:48 · 352 阅读 · 0 评论