自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(14)
  • 收藏
  • 关注

原创 多线程——synchronized补充

执⾏加锁操作,先进⼊内核态.在内核态判定当前锁是否已经被占⽤,如果该锁没有占⽤,则加锁成功,并切换回⽤⼾态.如果该锁被占⽤,则加锁失败.此时线程进⼊锁的等待队列,挂起.等待被操作系统唤醒.经历了⼀系列的沧海桑⽥,这个锁被其他线程释放了,操作系统也想起了这个挂起的线程,于是唤醒这个线程,尝试重新获取锁。如果锁对象因为锁竞争而进入轻量级锁阶段,那么这个锁被释放后再被获取时,不会进入偏向锁阶段。轻量级锁:当锁处于偏向锁阶段,并且有其他线程来竞争这个锁时,锁就会进入轻量级锁阶段(自适应的自旋锁)。

2024-04-12 15:22:50 398

原创 多线程——锁策略

公平锁是指,锁会按照尝试获取这个锁的线程的先后顺序来分配,如果A线程持有这个锁,B、C线程尝试锁,但是B线程尝试获取锁的时间早于C,那么这个锁在被A释放后,乐观锁:是指假设最好的情况,去访问数据时,并不会真正的加锁,而是直接访问,在访问的同时识别是否会发生冲突(可能会造成一些资源的浪费,如占用更多的cpu)。挂起等待锁是指,当一个线程获取锁失败后,会放弃再获取锁,而是等待内核“通知”,收到通知后,再去尝试获取锁。可重入锁指,当在这个锁的代码块内,再次对这个锁对象上锁,不会出现死锁,能够成功的上锁。

2024-04-12 14:59:51 364

原创 多线程案例——线程池

由于进程的创建和销毁的开销过大,所以我们引入了线程。但是,在线程的使用过程中,不断的创建和销毁线程,这个开销不断变大,所以我们需要一个方法来减少线程的创建和销毁的开销。有两种办法来减少这个开销:1.使用纤程/携程 ->更轻量化的线程。

2024-04-10 13:13:36 583 1

原创 多线程——定时器

定时器是一种能够指定任务在多久时间后执行的组件。

2024-04-04 11:06:00 365 1

原创 多线程案例——阻塞队列

阻塞队列是一种特殊的队列,也遵循“先进先出”阻塞队列能是⼀种线程安全的数据结构,并且具有以下特性:当队列满时,入队列会阻塞,直到有其他线程从队列中取出元素。当队列空时,出队列会阻塞,直到有其他线程从往队列中插入元素。相比于普通队列,阻塞队列是线程安全的.阻塞队列的⼀个典型应⽤场景就是"⽣产者消费者模型".这是⼀种⾮常典型的开发模型.

2024-03-29 19:51:35 706 1

原创 多线程案例——单例模式

单例模式是一种常见的设计模式,单例模式能保证某个类在程序中只存在唯⼀⼀份实例,而不会创建出多个实例.实现单例模式的方法有很多,这里举例饿汉模式和懒汉模式。

2024-03-29 13:40:52 629 1

原创 多线程——wait和notify

试想一个这样的场景,ABC三人去atm取钱,当A进入atm后,就会锁上门,也就是对门加锁,此时BC想要进入atm就要等待A开门,也就是释放锁。当A出来后,就会和BC一起参与到“门”这个锁的竞争中,但是,在这个竞争中,刚刚释放锁的A是有优势的,也就是大概率A又会重新拿到这个锁。⽅法notify()也要在同步⽅法或同步块中调⽤,该⽅法是⽤来通知那些可能等待该对象的对象锁的其它线程,对其发出通知notify,并使它们重新获取该对象的对象锁。如果不传入参数,那么线程就会无限等待下去,直至被唤醒然后解除等待状态。

2024-03-27 17:09:16 624

原创 解决线程安全问题--volatile

为什么要引入volatile关键字?观察以下这个代码以及他的运行结果.可以观察到,即使我们以及输入了1将flag修改了,但是t1中仍然在执行flag为0的逻辑.像这样的问题,成为内存可见性问题。在代码的执行过程中,编译器以及JVM会对我们写的代码进行“优化”,但是这个优化在多线程时可能会出现问题。

2024-03-26 15:45:56 228

原创 锁在使用时产生的问题——死锁问题

观察死锁是如何产生的,观察下面这段代码运行一段时间后,许久都没有等到t1或者t2打印的内容,并且通过工具可以观察到,此时t1和t2都处于BLOCKED状态并且t1的锁持有者为t2,t2的锁持有者为t1,因为这时候t1在等待t2释放lock2,t2在等待t1释放lock1,这时就产生了死锁.

2024-03-23 18:14:49 322 1

原创 解决线程安全问题——加锁(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 736

原创 线程安全问题-产生问题的原因

观察下面的代码和执行结果i < 5000;});i < 5000;});t1.start();t2.start();t1.join();t2.join();可以发现此时结果本应该为10000,但是执行了两次结果不但不为10000而且两次的执行结果不一样。这时就引发了由多线程带来的线程安全问题。

2024-02-06 19:32:43 1031

原创 线程的状态

从运行结果来看第一次打印的 NEW 为线程开始工作前所打印,此时没有调用start方法去内核中创建线程,之后打印的 RUNNABLE 为线程在执行时 while循环打印的内容,打印条件为 线程t在工作中,最后打印的 TERMINATED 为while循环结束后打印 此时t线程工作完毕 但是Thread对象t仍然存在,内核中不存在 线程t。WAITING:一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态.RUNNABLE: 可⼯作的. ⼜可以分成正在⼯作中和即将开始⼯作.

2023-12-17 13:31:05 198

原创 线程的创建、启动、运行与终止

2.join的位置不可以随便( 在上面的代码中start t1、t2后 使用了t1.join t2.join 意为:启动t1线程、启动t2线程、等待t1线程执行结束、等待t2线程执行结束)那么,t就会被异常唤醒,在上文的"休眠线程"中说过:如果线程因为调⽤ sleep⽅法⽽阻塞挂起,当sleep被异常唤醒,它就会抛出InterruptedException,此时就会。cpu上工作,有⼀点要记得,因为线程的调度是不可控的,所以,这个⽅法只能保证 实际休眠时间是⼤于等于参数设置的休眠时间的。

2023-12-14 20:51:09 1313

原创 多线程-多线程的初步认识

对多线程的初步了解

2023-12-12 23:14:46 22

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除