
多线程
文章平均质量分 66
王小禾
武汉理工大学
展开
-
HDFS中的优秀的多线程设计
关于ThreadPoolExecutor、ExecutorCompletionService等多线程设计在HDFS中得到了淋漓尽致的应用。本文总结HDFS中的优秀的多线程的设计,学习其设计思想。1.HDFS Hedged Read :两个线程多数据,谁先读到用谁的,其他线程取消。...原创 2021-01-25 20:22:08 · 457 阅读 · 0 评论 -
ExecutorService与CompletionService(ExecutorCompletionService)使用与探究
好文链接深度剖析好文:“既生 ExecutorService, 何生 CompletionService?”ExecutorCompletionService的使用和实现1.重大差异:ExecutorService submit()的结果是Future, Future get() 方法的致命缺陷:如果 Future 结果没有完成,调用 get() 方法,程序会阻塞在那里,直至获取返回结果。CompletionService 可以做到获取最先执行完的任务结果。2.使用方式:execut原创 2021-01-25 16:42:26 · 950 阅读 · 0 评论 -
一文总结线程池ThreadPoolExecutor
文章目录1. 概述2. 线程池核心设计与实现参考文献:Java线程池实现原理及其在美团业务中的实践java并发编程的艺术1. 概述好处使用线程池可以带来一系列好处:降低资源消耗:通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗。提高响应速度:任务到达时,无需等待线程创建即可立即执行。提高线程的可管理性:线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会因为线程的不合理分布导致资源调度失衡,降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控。提供更多更强大原创 2021-01-23 23:37:15 · 332 阅读 · 0 评论 -
关于线程池ConnectionPool的临时记录
hadoop中router就是自己实现线程池来维护响应线程,来响应请求的。package org.apache.hadoop.hdfs.server.federation.router;public class ConnectionPool { protected ConnectionContext getConnection() { this.lastActiveTime = Time.now(); // Get a connection from the pool foll原创 2020-08-17 14:22:29 · 270 阅读 · 0 评论 -
并发截图版2
先找L1缓存,再找L2缓存,再找L3缓存。缓存是按块来读的。缓存块的大小叫做缓存行,固定大小64字节。缓存一致性:缓存行在其他核更新时,本缓存如何更新?缓存行的4中状态。英特尔CPU使用MESI缓存一致性协议。花3s时间。对比:只花了1.2s。说明:两个值非常近时,多线程访问速度可能低。加入填充后,x不可能与其他变量在同一个缓存行。因此改变时不需要通知其他缓存行。有的源码如下:添加了无效字段的填充。volatile:1.线程可见性2.禁止重排序。cp..原创 2020-06-26 21:41:07 · 215 阅读 · 0 评论 -
并发截图版
1.进程:操作系统分配资源(空间、文件、接口等)的基本单位线程:CPU执行的基本单位。2.1个cpu在一个时间点只执行一个线程。能执行多个线程是因为线程切换(上下文切换)3.ALU:计算使用Registers:存储PC:记录位置线程切换时要【保护现场】,下次切回来再使用。切换线程也有线程开销的,线程个数经验:cpu 密集型n+1 非cpu密集型 2n+1重量级:操作系统来管理的;轻量级:不需要操作系统来管理的,都是轻量级。调用了汇编指令的cmpx..原创 2020-06-25 21:58:36 · 355 阅读 · 0 评论 -
线程 CompletableFuture详解
CompletableFuture参考:https://blog.csdn.net/u012129558/article/details/78962759https://www.jianshu.com/p/bdc6bd50f7d2Future模式的缺点Future虽然可以实现获取异步执行结果的需求,但是它没有提供通知的机制,我们无法得知Future什么时候完成。要么使用阻塞,在fu...原创 2019-04-10 17:01:20 · 1314 阅读 · 0 评论 -
java并发编程的艺术读书笔记(1)
第一章 并发编程的挑战 上下文切换1 多线程一定快吗不一定1 死锁第一章 并发编程的挑战 1 上下文切换1.1 多线程一定快吗(不一定)当并发执行累加操作不超过百万次时,速度会比串行执行累加操作要 慢。那么,为什么并发执行的速度会比串行慢呢?这是因为线程有创建和上下文切换的开销。public class ConcurrencyTest { private static final原创 2017-08-15 12:08:50 · 239 阅读 · 0 评论 -
volitale原理
计算机内存模型java内存模型类似于上所述原子性可见性有序性深入剖析volitaleVolatile与可见性能保证可见性Volatile与原子性不能保证原子性Volatile与有序性Volatile的原理和实现机制组织结构: |计算机内存模型(内存–>CPU高速缓存) | | |原子性 | | |可见性 | | |有序性计算机内存模型计算机在执行程序时,每条指令都原创 2017-08-15 13:53:50 · 490 阅读 · 0 评论 -
synchronized原理
在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了。 CAS(Compare and Swap),用于在硬件层面上提供原子性操作。基础Java中的每一个对象都可以作为锁。对于同步方法,锁是当前实例对象。对于静态原创 2017-08-15 14:26:38 · 256 阅读 · 1 评论 -
ConcurrentHashMap
1. 为什么要使用ConcurrentHashMap 在并发编程中使用HashMap可能导致程序死循环。而使用线程安全的HashTable效率又非常低下,基于以上两个原因,便有了ConcurrentHashMap的登场机会。(1)线程不安全的HashMapfinal HashMap map = new HashMap(2); Thread t = new Thread(new Runnable(原创 2017-08-15 20:01:22 · 269 阅读 · 0 评论 -
线程7:Callable、Future与线程池使用池
在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。今天我们就来讨论一下Callable、Future和FutureTask三个类的使用方法。1. Calla...原创 2019-04-10 11:52:40 · 557 阅读 · 0 评论 -
线程6:生产者消费者模式
引言 生产者消费者要素一采用synchronized锁以及wait notify方法实现二采用Lock锁以及await signal方法实现三采用BlockQueue实现引言 生产者消费者要素我们将生产者作为一个线程类、消费者作为一个线程类。那么生产方法、消费方法由谁来调用、生产消费的是什么,我们从这几点出发,总结出以下几个要写的类(类比取钱/存钱,和账户类)。实体类,其中写生产方法。消费方原创 2017-08-17 22:18:38 · 213 阅读 · 0 评论 -
线程3:线程间通信
(一)传统线程通信 (有同步监视器,synchronozed代码块或方法均可)wait(); 阻塞,不同于死锁notify(); 随机唤醒同步监视器上的一个线程notifyAll(); 唤醒同步监视器上的所有线程说明:可以先唤醒其他线程,但是不会执行,当前线程wait()后才会执行 可以先wait再notify。如先wait即被阻塞,notify不会执行存取交互p原创 2017-08-16 22:44:55 · 268 阅读 · 0 评论 -
线程5:线程通信的补充:正确使用wait等
1. notify()和notifyAll()的区别如果某些线程在等待某些条件触发,那当那些条件为真时,你可以用 notify 和 notifyAll来通知那些等待中的线程重新开始运行。不同之处在于,notify 仅仅通知一个线程,并且我们不知道哪个线程会收到通知,然而 notifyAll会通知所有等待中的线程。换言之,如果只有一个线程在等待一个信号灯,notify和notifyAll都会通知到这个原创 2017-08-17 20:08:31 · 215 阅读 · 0 评论 -
线程4:线程池
线程池就会启动一个线程来执行他们的run( )或call( )方法,执行结束后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个Runnable对象的run( )或者call( )方法。Java通过Executors提供四种线程池。newCachedThreadPool()newFixedThreadPool(int nThread):newScheduledThreadPool(int n)newSingleThreadExecutor()原创 2017-08-17 16:18:22 · 204 阅读 · 0 评论 -
线程3:线程同步
为何要使用同步安全问题银行取钱问题三种同步方法线程安全方法1同步代码块方法2用同步方法实现方法3同步锁Lock为何要使用同步?java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,从而保证了该变量的唯一性和准确性。安全问题—银行取钱问题public cl原创 2017-08-16 14:41:45 · 177 阅读 · 0 评论 -
线程2:线程的生命周期与控制
1.线程的生命周期线程是一个动态执行的过程,它也有一个从产生到死亡的过程。(1)生命周期的五种状态 新建(new Thread)当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。例如:Thread t1=new Thread();就绪(runnable)线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到原创 2017-08-15 22:39:00 · 193 阅读 · 0 评论 -
线程1:线程的创建和启动
1. 多线程的创建1)通过扩展Thread类来创建多线程假设一个影院有三个售票口,分别用于向儿童、成人和老人售票。影院为每个窗口放有100张电影票,分别是儿童票、成人票和老人票。三个窗口需要同时卖票,而现在只有一个售票员,这个售票员就相当于一个CPU,三个窗口就相当于三个线程。通过程序来看一看是如何创建这三个线程的。 publicclass MutliThrea原创 2017-08-15 22:09:02 · 278 阅读 · 0 评论 -
CountDownLatch--控制三个线程执行顺序(三)
前言线程中run方法调用CountDownLatch。CountDownLatch的两个核心方法:countObj.countDown() 表示countObj计数减少。countObj.await() 表示检查countObj若不为0则阻塞,为0,则允许执行。比较joinjoin的工作原理是(源码),不停检查thread是否存活,如果存活则让当前线程永远wait,直到thread线程终止,线原创 2017-08-28 22:47:03 · 3951 阅读 · 0 评论 -
CountDownLatch--一组线程完成后其他线程才执行(二)
问题:一个团队赛跑游戏,最后要计算团队赛跑的成绩,主线程计算最后成绩,要等到所有import java.util.Random;import java.util.concurrent.CountDownLatch;public class CountDownLatchTest2 { public static void main(String[] args) throws Interr原创 2017-05-21 19:12:31 · 364 阅读 · 0 评论 -
CountDownLatch--一组线程完成后其他线程才执行(一)
问题背景:问题一:java多线程,A、B、C、D统计4个盘大小,统计完后第5个人汇总。问题二:比如一个团队赛跑游戏,最后要计算团队赛跑的成绩,主线程计算最后成绩,要等到所有团队成员跑完,方可计算总成绩。java.util.concurrent.CountDownLatch你可以向 CountDownLatch 对象设置一个初始计数值,任何在这个对象上调用 aw原创 2017-05-21 18:08:10 · 2265 阅读 · 0 评论