
多线程
文章平均质量分 72
多线程相关知识
想养一只萨摩耶~
请在合适的地方掉头并重新规划路线
展开
-
CountDownLatch
(门阀、计数器)是多线程控制的一种工具 ,它用来协调各个线程之间的同步。countDownLatch相当于一个计数器,能够使一个线程等待另外一些线程完成各自的工作后,再继续执行。这个计数器的初始值就是线程的数量,每当一个线程完成之后,计数器就进行减1,当计数器的值为0时,那么在countDownLatch上等待的线程就可以继续执行。countDownLatch接收一个int类型的参数,表示要等待的工作线程个数}原创 2022-11-28 16:27:35 · 935 阅读 · 0 评论 -
ThreadLocal为什么会出现内存泄漏,你真的知道吗?
目录1 前言2 ThreadLocal进行线程隔离的小示例3 原因大家想要搞清楚这个问题,就必须知道内存泄漏和内存溢出的区别内存泄漏:不就被使用的对象或者变量无法被回收内存溢出:没有剩余的空间来创建新的对象同一个threadlocal对象,不同线程之间存储的值是获取不到的控制台输出: 可以发现在不同的线程里面放置东西,其它线程里面是找不到的。解析原因,观察是如何向threadlocal中放置值的:1)先获取当前线程t,然后根据t获取threadmap对象2)判断map是否为null,ma原创 2022-11-15 16:12:27 · 2860 阅读 · 6 评论 -
volatile~多线程下变量不可见
目录1 概述2 案例3 JMM内存模型4 如何解决4.1 加锁4.2 volatile关键字 在多线程并发执行下,多个线程修改共享的成员变量,会出现一个线程修改了共享变量的值后,另一个线程不能直接看到该线程修改之后的最新值。代码示例:运行结果:可见,当子线程修改了变量的值时,主线程依然没有读取到修改之后的值。JMM(Java Memory Model):java内存模型,是java虚拟机规范中所定义的一种内存模型,java内存模型是标准化的,屏蔽掉了底层不同计算机的区别。java内存模型原创 2022-06-22 10:49:27 · 686 阅读 · 0 评论 -
线程常用调度方法
目录一 线程等待二 线程通知三 线程休眠四 请求让出CPU执行权五 线程中断1 wait():当一个线程调用了wait()方法后,这个线程会被阻塞挂起,直到发生了下面几种情况才会返回1)线程调用了notify()或者notifyAll()唤醒方法2)其他线程调用了线程的interrupt()中断方法,线程抛出InterruptedException异常返回。2 wait(long timeout):这个方法比wait()方法多了一个超时参数timeout,如果线程调用这个方法后,没有在指定的timeout时原创 2022-06-21 15:13:46 · 2200 阅读 · 0 评论 -
AQS的初步了解
目录1 什么是AQS2 ReentrantLock加锁和释放锁的底层原理AQS(AbstractQueuedSynchronizer): 是jdk提供的一个同步框架,内部维护着FIFO双向队列,即CLH同步队列。AQS依赖它来完成同步状态的管理(volatile修饰的state,用于标志是否持有锁)。如果获取同步状态state失败时,会将当前线程和等待信息构建成一个Node节点。将Node放到FIFO队列中,同时阻塞当前线程,当前线程同步状态state释放时,会把FIFO队列中的首节点唤醒,使其获取同步状态原创 2022-06-21 10:02:18 · 432 阅读 · 0 评论 -
wait和notify
1 wait()方法是Object类的方法,它的作用是使当前执行wait方法的线程等待,在wait所在的代码行处暂停执行,并释放锁,直到接到通知或中断。2 notify()方法是用来通知那些可能等待该锁的其他线程,如果有多个线程等待,则按照执行wait方法的顺序发出一次性通知(一次只能通知一个),使得等待排在第一顺序的线程获得锁,执行notify方法后,当前线程不会立即释放锁,要等到线程执行完,即退出synchronized同步区域后。总结:wait方法使线程暂停运行,而notify方法通知暂停的线程继续运原创 2022-06-17 15:11:10 · 1433 阅读 · 2 评论 -
出现异常锁被释放
程序在执行过程中,如果出现异常,默认情况下锁被释放,所以在并发处理的过程中,有异常要多家小心,不然可能会发生不一致的情况。比如:在一个web app处理过程中,多个servlet线程共同访问同一个资源,这是如果异常处理不合适,在第一个线程中抛出异常,其他线程就会进入到同步代码区,有可能会访问异常产生时的数据,因此要非常小心处理同步业务逻辑中的异常。如上代码所示,对m()方法进行加锁,正常情况下,t2线程是不会执行m方法的,但是由于t1线程执行的时候抛出了异常,锁被释放了,所以t2线程也执行了m方法。.原创 2022-06-16 14:07:20 · 483 阅读 · 0 评论 -
进程和线程的区别
进程:进程是分配资源的最小单位线程:线程是cpu调度的基本单位所以CPU只能执行一个线程,即一个cpu在同一时间点上只能执行一个线程。比如:当我们磁盘上的一个qq.exe程序,1)双击之后,它就会进入到内存当中(此时这个地方已经可以称之为一个线程)2)当这个进程需要执行的时候,cpu会去内存中读取指令,将指令读取过来之后会在CPU内部进行一个临时存储,我们称之为寄存器,在cpu中进行完运算之后,再返回给内存。(所以CPU基本上只拿指令和拿数据并做计算然后返回内存)假使现在有两个线程T1和T21)CPU先执行原创 2022-06-15 14:11:51 · 1050 阅读 · 0 评论 -
多线程~哲学家就餐问题
测试1 前言在网上看到了一个很好的例子解释了多线程里面的一些东西那就是哲学家就餐问题。如图:以上有5个哲学家和5根筷子。一个哲学家必须同时有两个筷子,那么他才能够吃饭。但是如果想要同时抓住两根筷子,就会有一些问题产生问题1:就拿哲学家1来说:他必须抓住他左右两边的筷子。那么此时哲学家2也抓住了他右边的筷子。那么哲学家1和哲学家2就会同时抓住1根筷子。就会出现锁竞争的问题。问题2:如果5个哲学家都抓住了右手边的筷子,那么他们的左手都会等待其他筷子的释放,但是其他哲学家释放筷子必须先吃完饭(完成任务)才会释放,原创 2022-06-14 20:58:52 · 490 阅读 · 0 评论 -
ForkJoin与for循环与stream并行流运行时间比较
1 什么是ForkJoin ForkJoin框架:在一定情况下,将一个大任务,进行拆分(fork)成若干个小任务,直到这个小任务不可再拆,然后再将一个个小任务获得的结果进行join合并汇总2 ForkJoin中的工作窃取算法 工作窃取算法就是如果我们需要将一个大的任务进行拆分成每个小任务,然后将每个小任务放到不同的队列里面并且交给每个单独的线程去执行。比如A线程处理A线程里的任务,B线程处理B线程里面的任务,但是A线程里面的任务执行完了,B线程的任务还没有执行完,依然...原创 2021-10-02 00:07:40 · 575 阅读 · 0 评论 -
如何使用jmeter模仿http请求
1)下载地址:Apache JMeter - Apache JMeter™2)下载完成后解压在bin目录下找到jmeter.properties文件将界面语言改成中文的双击jmeter.bat文件启动3)添加一个线程组添加>>线程用户>>线程组设置线程属性(线程数20,循环次数100)4)添加http请求线程组>>添加>>取样器>>HTTP请求5)添加查看结果树(可以查看执行结果)...原创 2022-05-04 16:34:23 · 657 阅读 · 0 评论 -
线程的6种状态
线程中的6中状态1 初始状态(NEW):线程未开始的状态线程刚刚创建出来,还没有调用start方法2 就绪状态(WAITING)调用了start方法,但是没有线程来进行调度3 运行时状态(RUNNABLE)有执行资格又有执行权,但它可能正在等待来自操作系统的其他资源,例如处理器。4 阻塞状态(BLOCKED)阻塞状态,也称临时状态,有执行资格,但是没有执行权,需要等待执行权5超时等待(TIMED_WAITING):有限期等待状态 是用sleep方法传入一个要睡眠的时间原创 2022-04-11 10:49:14 · 5654 阅读 · 0 评论 -
什么叫做CAS
1 什么叫做CAS?CAS(compare and swap)比较并交换,在平时开发中其实很多底层都是用cas来实现的,像原子类的底层原理就是cas,乐观锁的底层原理也是cas。原子类的用法可见下面这篇博客volatile ~原子类_IT盛夏的果实的博客-优快云博客cas的特点:当多个线程同时使用cas去更新一个变量的时候,只有其中一个线程能够操作成功,其他的线程都能够操作失败,但是更新失败的线程不会阻塞,但失败的线程会自旋尝试更新(默认都有尝试更新的次数)。CAS中的核心操作:内存值V、原创 2022-04-11 09:34:59 · 795 阅读 · 0 评论 -
什么叫可重入锁
可重入性:就是一个线程不用释放,可以重复的获取一个锁n次,只是在释放的时候,也需要相应的释放n次。(简单来说:A线程在某上下文中或得了某锁,当A线程想要在次获取该锁时,不会应为锁已经被自己占用,而需要先等到锁的释放)假使A线程即获得了锁,又在等待锁的释放,就会造成死锁。注意:synchronized和reentrantlock都是可重入锁synchronized:无需释放锁,synchronized会自动释放锁 public static void main(String[] arg原创 2022-04-08 15:47:48 · 13870 阅读 · 2 评论 -
execute和submit的区别
execute和submit都属于线程池的方法,execute只能提交Runnable类型的任务,无返回值。而submit既能提交Runable类型的任务,返回值为null,也能提交Callable类型的任务,返回值为Future。execute会直接抛出任务执行时异常,submit则不会抛出异常,但可以通过Future的get方法将任务执行时的异常重新抛出。execute:1)异常会直接抛出 public static void main(String[] args) { .原创 2022-03-14 09:23:53 · 8809 阅读 · 4 评论 -
volatile ~原子类
1 多线程的可见性1.1 什么叫volatile:volatile是一种轻量级的同步机制,与synchronized同步代码块相比,性能更加的好1.2 volatile有什么作用,什么时候用到volatile: vollatile作为一种Java内在的同步机制,可以将我们jvm中主内存的值具有可见性,例如在多线程环境下,定义了一个静态变量a = 0 ,此时会有多个线程会对这个变量进行修改,线程A在自己栈中将值修改后同步到主内存,此时线程B是无法知道主内存的值...原创 2021-08-22 14:56:44 · 520 阅读 · 0 评论 -
ThreadLocal初步解析
1 ThreadLocal介绍 官话:ThreadLocal用来提供线程内的局部变量,这种变量在多线程环境下访问(通过get和set方法)时保证各个线程的变量相对于其他线程的变量。ThreadLocal示例通常来说都是private static类型的,用来关联线程和线程上下文。 我们可以得知ThreadLocal的作用是:提供线程内的局部变量,不同线程之间不会互相干扰,这种变量在线程周期内起作用,减少同一个线程内多个函数或多个组件之间一些公共变量的复杂度...原创 2021-10-07 22:35:42 · 284 阅读 · 0 评论 -
为什么阿里不建议用excutors创建线程池
1 前言: 大家都知道,阿里规范中有一条是不允许用excutors去创建线程池,而是采用ThreadPoolExecutor的原生方式去创建。很早就听过所过这种说法,但是一直都没去搞清楚是为什么,今天就查阅资料去了解了这个问题。2 Excutors创建线程的方式 通过Excutors来创建线程池,有4种创建线程的方法。newCachedThreadPool创建一个可缓存线程池,如果线程池的大小超过了处理任务所需的线程,那么就会回收部份空闲线(60秒不处理任务)线程...原创 2021-11-08 15:27:41 · 2855 阅读 · 0 评论 -
线程池7大核心参数介绍
1ThreadPoolExecutor创建线程池public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnab.原创 2021-11-14 18:03:36 · 11467 阅读 · 4 评论