多线程
文章平均质量分 77
多线程学习及实践
艾菜籽
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
多线程下使用集合类
CopyOnWriteArrayList是:在添加新的元素时不直接添加在原容器中,而是先把原容器复制一份,再添加到复制出的容器中,添加完毕后将引用指向复制出的容器.1.读操作不再加锁,只对写操作加锁,而且不再给方法加锁,而是将每个"桶"进行加锁(给链表头节点加锁),降低了锁冲突的概率.3).⼀旦触发扩容,就由该线程完成整个扩容过程.这个过程会涉及到⼤量的元素拷⻉,效率会⾮常低.Vector,Stack,HashTable,是线程安全的(不建议⽤),其他的集合类不是线程安全的.④搬运完毕后,将老表删除.原创 2025-08-30 13:21:13 · 577 阅读 · 0 评论 -
锁ReentrantLock
ReentrantLock也是一个可重入锁,定位与synchronized类似.原创 2025-08-26 21:28:29 · 276 阅读 · 0 评论 -
锁在使用时产生的问题——死锁问题
观察死锁是如何产生的,观察下面这段代码运行一段时间后,许久都没有等到t1或者t2打印的内容,并且通过工具可以观察到,此时t1和t2都处于BLOCKED状态并且t1的锁持有者为t2,t2的锁持有者为t1,因为这时候t1在等待t2释放lock2,t2在等待t1释放lock1,这时就产生了死锁.原创 2024-03-23 18:14:49 · 408 阅读 · 1 评论 -
解决线程安全问题--volatile
为什么要引入volatile关键字?观察以下这个代码以及他的运行结果.可以观察到,即使我们以及输入了1将flag修改了,但是t1中仍然在执行flag为0的逻辑.像这样的问题,成为内存可见性问题。在代码的执行过程中,编译器以及JVM会对我们写的代码进行“优化”,但是这个优化在多线程时可能会出现问题。原创 2024-03-26 15:45:56 · 354 阅读 · 0 评论 -
多线程——synchronized补充
执⾏加锁操作,先进⼊内核态.在内核态判定当前锁是否已经被占⽤,如果该锁没有占⽤,则加锁成功,并切换回⽤⼾态.如果该锁被占⽤,则加锁失败.此时线程进⼊锁的等待队列,挂起.等待被操作系统唤醒.经历了⼀系列的沧海桑⽥,这个锁被其他线程释放了,操作系统也想起了这个挂起的线程,于是唤醒这个线程,尝试重新获取锁。如果锁对象因为锁竞争而进入轻量级锁阶段,那么这个锁被释放后再被获取时,不会进入偏向锁阶段。轻量级锁:当锁处于偏向锁阶段,并且有其他线程来竞争这个锁时,锁就会进入轻量级锁阶段(自适应的自旋锁)。原创 2024-04-12 15:22:50 · 483 阅读 · 0 评论 -
解决线程安全问题——加锁(synchronized)
当t1线程开始后,会执行lock的sout方法,sout方法是被synchronized所修饰的,这时synchronized就会对lock对象加锁,当t2线程开始时,也会尝试执行lock的sout方法,但是此时lock已被加锁synchronized尝试对lock加锁时会失败,t2就会进入锁竞争等待。在上文synchronized的特性中写道:synchronized会起到互斥效果,某个线程执⾏到某个对象的synchronized中时,其他线程如果也执⾏到同⼀个对象synchronized就会阻塞等待。原创 2024-03-22 20:09:01 · 981 阅读 · 0 评论 -
多线程案例——阻塞队列
阻塞队列是一种特殊的队列,也遵循“先进先出”阻塞队列能是⼀种线程安全的数据结构,并且具有以下特性:当队列满时,入队列会阻塞,直到有其他线程从队列中取出元素。当队列空时,出队列会阻塞,直到有其他线程从往队列中插入元素。相比于普通队列,阻塞队列是线程安全的.阻塞队列的⼀个典型应⽤场景就是"⽣产者消费者模型".这是⼀种⾮常典型的开发模型.原创 2024-03-29 19:51:35 · 846 阅读 · 1 评论 -
多线程案例——线程池
由于进程的创建和销毁的开销过大,所以我们引入了线程。但是,在线程的使用过程中,不断的创建和销毁线程,这个开销不断变大,所以我们需要一个方法来减少线程的创建和销毁的开销。有两种办法来减少这个开销:1.使用纤程/携程 ->更轻量化的线程。原创 2024-04-10 13:13:36 · 692 阅读 · 1 评论 -
多线程——wait和notify
试想一个这样的场景,ABC三人去atm取钱,当A进入atm后,就会锁上门,也就是对门加锁,此时BC想要进入atm就要等待A开门,也就是释放锁。当A出来后,就会和BC一起参与到“门”这个锁的竞争中,但是,在这个竞争中,刚刚释放锁的A是有优势的,也就是大概率A又会重新拿到这个锁。⽅法notify()也要在同步⽅法或同步块中调⽤,该⽅法是⽤来通知那些可能等待该对象的对象锁的其它线程,对其发出通知notify,并使它们重新获取该对象的对象锁。如果不传入参数,那么线程就会无限等待下去,直至被唤醒然后解除等待状态。原创 2024-03-27 17:09:16 · 765 阅读 · 0 评论 -
多线程——定时器
定时器是一种能够指定任务在多久时间后执行的组件。原创 2024-04-04 11:06:00 · 504 阅读 · 1 评论 -
多线程案例——单例模式
单例模式是一种常见的设计模式,单例模式能保证某个类在程序中只存在唯⼀⼀份实例,而不会创建出多个实例.实现单例模式的方法有很多,这里举例饿汉模式和懒汉模式。原创 2024-03-29 13:40:52 · 775 阅读 · 1 评论 -
线程安全问题-产生问题的原因
观察下面的代码和执行结果i < 5000;});i < 5000;});t1.start();t2.start();t1.join();t2.join();可以发现此时结果本应该为10000,但是执行了两次结果不但不为10000而且两次的执行结果不一样。这时就引发了由多线程带来的线程安全问题。原创 2024-02-06 19:32:43 · 1138 阅读 · 0 评论 -
线程的创建、启动、运行与终止
2.join的位置不可以随便( 在上面的代码中start t1、t2后 使用了t1.join t2.join 意为:启动t1线程、启动t2线程、等待t1线程执行结束、等待t2线程执行结束)那么,t就会被异常唤醒,在上文的"休眠线程"中说过:如果线程因为调⽤ sleep⽅法⽽阻塞挂起,当sleep被异常唤醒,它就会抛出InterruptedException,此时就会。cpu上工作,有⼀点要记得,因为线程的调度是不可控的,所以,这个⽅法只能保证 实际休眠时间是⼤于等于参数设置的休眠时间的。原创 2023-12-14 20:51:09 · 1580 阅读 · 0 评论 -
线程的状态
从运行结果来看第一次打印的 NEW 为线程开始工作前所打印,此时没有调用start方法去内核中创建线程,之后打印的 RUNNABLE 为线程在执行时 while循环打印的内容,打印条件为 线程t在工作中,最后打印的 TERMINATED 为while循环结束后打印 此时t线程工作完毕 但是Thread对象t仍然存在,内核中不存在 线程t。WAITING:一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态.RUNNABLE: 可⼯作的. ⼜可以分成正在⼯作中和即将开始⼯作.原创 2023-12-17 13:31:05 · 258 阅读 · 0 评论 -
多线程——锁策略
公平锁是指,锁会按照尝试获取这个锁的线程的先后顺序来分配,如果A线程持有这个锁,B、C线程尝试锁,但是B线程尝试获取锁的时间早于C,那么这个锁在被A释放后,乐观锁:是指假设最好的情况,去访问数据时,并不会真正的加锁,而是直接访问,在访问的同时识别是否会发生冲突(可能会造成一些资源的浪费,如占用更多的cpu)。挂起等待锁是指,当一个线程获取锁失败后,会放弃再获取锁,而是等待内核“通知”,收到通知后,再去尝试获取锁。可重入锁指,当在这个锁的代码块内,再次对这个锁对象上锁,不会出现死锁,能够成功的上锁。原创 2024-04-12 14:59:51 · 442 阅读 · 0 评论 -
多线程--创建线程Callable
本文介绍了Java中使用Callable接口创建线程并获取返回值的方法。与Runnable不同,Callable允许线程返回结果。文章通过代码示例展示了如何定义Callable任务(计算1到1000的和),并配合FutureTask使用:先将Callable包装为FutureTask,再传入Thread。最后通过FutureTask的get()方法获取计算结果,该方法会阻塞直至任务完成。这种方式解决了Runnable无法返回结果的问题。原创 2025-08-26 21:01:08 · 376 阅读 · 0 评论 -
CAS简述
CAS,全称Compare and swap,字⾯意思为⽐较并交换,⼀个CAS涉及到以下操作:内存中有数值A,寄存器1中有A,寄存器2中有B1,比较内存中数值是否和寄存器中数值相等2,如果相等,将另一个寄存器的值写入内存3,返回交换是否成功如:比较内存和寄存器1中的值,均为A,故将内存中的A和寄存器2中的B交换,返回true.伪代码示例。原创 2025-08-26 20:43:49 · 289 阅读 · 0 评论 -
多线程-多线程的初步认识
对多线程的初步了解原创 2023-12-12 23:14:46 · 166 阅读 · 0 评论
分享