多线程
文章平均质量分 94
Java多线程
卷我没对象、
这个作者很懒,什么都没留下…
展开
-
【 多线程案列 - 线程池 】
将线程提前创建好,放入到一个特定的池子中,后面使用线程的时候就不需要重新创建,而是直接从该池子中获取,且用完之后又放入该池子.这样不需要频繁地销毁创建线程了.速度就快得多.而这个池子就是线程池为什么线程放入线程池就比从系统中申请释放来的更快呢?原创 2023-03-21 19:03:29 · 121 阅读 · 0 评论 -
【 多线程案例 - 定时器 】
定时器也是软件开发中的一个重要组件. 类似于一个 “闹钟”. 达到一个设定的时间之后, 就执行某个指定好的代码.定时器是一种实际开发中非常常用的组件.比如网络通信中, 如果对方 500ms 内没有返回数据, 则断开连接尝试重连.比如一个 Map, 希望里面的某个 key 在 3s 之后过期(自动删除).类似于这样的场景就需要用到定时器。原创 2023-03-21 16:27:11 · 116 阅读 · 0 评论 -
【 多线程案例 - 阻塞队列 】
阻塞队列是一种特殊的队列. 也遵守“先进先出”的原则.阻塞队列能是一种线程安全当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素.当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往队列中插入元素.实际开发中使用到的阻塞队列并不是一个简单的数据结构,而是一个专门的服务器程序,他提供阻塞队列的功能,还会在此基础上提供更多,如对数据持久化储存,支持多个数据通道,支持多节点容灾冗余备份,支持管理面板等等,而这样的队列又有新名字,叫信息队列。原创 2023-03-21 10:05:54 · 89 阅读 · 0 评论 -
【 多线程案例 - 单例模式 】
所以按照上述加锁方式,无论代码是初始化之前还是初始化之后,每次调用getinstance时都会进行加锁,也就意味着即使初始化之后是线程安全的,但还是存在着大量不必要的锁竞争!因为static修饰的成员是"类成员",一个java程序中,jvm会保证只有一个类对象,进一步在饿汉模式中也就保证了类的static成员也是只有一份。这里是针对Singleton类对象进行加锁,这个类对象在程序中只有一份,在多个线程调 getinstance的时候就可以保证是针对同一个对象加锁!以上就是线程安全的懒汉模式,原创 2023-03-20 16:54:38 · 56 阅读 · 0 评论 -
【 wait 和 notify 】
1.方法notify()也要在同步方法或同步块中调用,该方法是用来通知那些可能等待该对象的对象锁的其它线程,对其发出通知notify,并使它们重新获取该对象的对象锁。其实理论上 wait 和 sleep 完全是没有可比性的,因为一个是用于线程之间的通信的,一个是让线程阻塞一段时间,唯一的相同点就是都可以让线程放弃执行一段时间.由于线程之间是抢占式执行的, 因此线程之间执行的先后顺序难以预知.但是实际开发中有时候我们希望合理的协调多个线程之间的执行先后顺序。(并没有 “先来后到”)原创 2023-03-19 17:14:28 · 82 阅读 · 0 评论 -
【 synchronized关键字 和 volatile关键字 】
可重入锁降低了程序猿的负担,提高了开发效率,但是也带来了代价,即程序中所需开销更高,比如锁需要维护,加减计数降低了运行效率。原创 2023-03-19 16:15:29 · 68 阅读 · 0 评论 -
【 线程安全(重点) 】
线程不安全的万恶之源是由于线程是抢占式执行的,随机无序的,我们无法避免,只能通过方案来应对。以上介绍的几种情况都可能造成线程不安全,并且也是我们日常写代码高频出现的问题。对其解决办法就是进行一系列的加锁操作,但是加锁后会降低线程的并发程度,降低效率所以我们也需要结合实际,考虑如何适当加锁。上面的加锁操作我们会在后面仔细讲解。原创 2023-03-19 13:33:41 · 34 阅读 · 0 评论 -
【 Thread类及常见方法 】
需要给标志位上加 volatile 关键字(这个关键字的功能后面介绍)原创 2023-03-18 20:00:29 · 388 阅读 · 0 评论 -
【 认识和创建线程 】
1、后续的几种创建方法只是前两个方法的翻版,使用了匿名内部类!2、通常认为Runnable 接口这种方法会更好,它能做到让各线程的任务更好的解耦。Runnable只是描述了线程具体的任务,至于这个任务怎么去执行,它并不关心!原创 2023-03-18 14:22:19 · 58 阅读 · 0 评论 -
【 了解进程 】
这种情况就类似于早起的操作系统,里面的进程都是访问同一个内存的地址空间,如果某个进程出现了BUG就可能引起其他进程的崩溃。在Linux中,所谓的创建进程就是把PCB加到链表中,而销毁进程就是从链表中删除,查看进程就是遍历链表。在上文中我们提到了 进程调度,所谓进程调度其实就是操作系统在考虑如何给各个进程分配CPU资源,而具体如何分配资源,我们需要通过虚拟地址空间来实现。但是在实际工作中,我们有的时候还是需要进程间的交互的,这个时候我们该如何来实现进程间的通信呢?进程的身份标识,相当于人的身份证号码。原创 2023-03-18 12:42:58 · 32 阅读 · 0 评论