![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 87
disgare
这个作者很懒,什么都没留下…
展开
-
CompletableFuture 相关用法
由于guava中Listenablefuture的成功,在Java8中,设计师们也新加了一个包含50个方法左右的类CompletableFuture。它的优点就是异步编程,同时这个类的使用也相当抽象…非常抽象。原创 2022-07-20 19:59:16 · 449 阅读 · 0 评论 -
ThreadLocal 原理以及使用
在ThreadLocalMap.set()方法的最后,如果执行完启发式清理工作后,未清理到任何数据,且当前散列数组中Entry的数量已经达到了列表的扩容阈值(len*2/3),就开始执行rehash()逻辑,也就是扩容处理。因为ThreadLocalMap的键为弱引用,值为强引用,每次GC后,键的指向都为null(因为ThreadLoacl被回收掉了,但是这个弱引用指针并没有被回收),值的指向对象依然没有被回收,产生了OOM问题。解决办法是在使用完毕后调用remove方法手动清除。碰撞处理使用动态寻址法。原创 2022-09-07 19:15:16 · 136 阅读 · 0 评论 -
AQS 组件
对非公平锁而言,在调用lock函数的时候它会直接CAS试试能不能拿锁,然后进入和公平锁差不多的acquire方法,如果发现锁这个时候被释放了(state==0),非公平锁会直接CAS抢锁,其他的步骤与公平锁相似。它定义最多有几个线程同时执行,只有抢到state的线程才会运行,抢到state的线程可能有多个,其他的线程会在CLH队列中等待,如果其中某一个线程运行完毕调用release方法,信号量会自动唤醒等待队列中的线程。在独占状态下可以实现两种模式,公平锁(排队获取锁)与非公平锁(抢锁)...原创 2022-08-29 20:10:36 · 409 阅读 · 0 评论 -
FutureTask 源码阅读
我们都知道Future这个接口是为了去除主线程的等待时间,以方便用等待时间处理其他复杂的业务逻辑这个接口总共只有5个方法,通过方法名就可以见名知意。原创 2022-07-27 19:25:39 · 85 阅读 · 0 评论 -
CompletableFuture 源码浅要阅读
以上,我们简单过了一遍CompletableFuture的创建以及后续操作的实现CompletableFuture的创建是使用CAS操作将我们的传入的方法以及最后的实现参数赋值给CompletableFuture中的属性CompletableFuture中对于各个组的实现大同小异后续操作是从postComplete方法中引出来的,后续操作定义在CompletionStage接口中,后续操作的实现是通过Compition类的链表结构实现的。.........原创 2022-07-22 15:13:06 · 372 阅读 · 0 评论 -
多线程基础学习笔记
多线程基础学习笔记多线程实现方式继承Thread类实现Runnable接口实现Callable接口线程的生命周期新建可运行阻塞等待定时等待死亡线程调度优先级让步插队后台多线程同步线程安全同步代码块同步方法同步锁多线程通信多线程实现方式继承Thread类1,构造Thread子类,重写run方法2,创建该子类实例对象,调用start方法特点:java只能继承一个父类实现Runnable接口1,构造Runnable接口子类实例对象,重写run方法2,创建该子类实例对象3,调用有参的Thread构原创 2021-03-11 22:11:35 · 346 阅读 · 5 评论 -
多线程安全学习笔记
1,在编写代码时加入 sychronized 保证线程安全2,代码编译为字节码时翻译为 monitorenter、monitorexit、ACC_SYCHRONIZED,并且有锁的自动进化过程3,sychronized 在机器语言中轻量级的实现,是 lock comxchg 指令,lock 保证原子性,comxchg 代表 CAS 操作,是 CPU 对 CAS 的原语支持;重量级的实现,是对操作系统锁 Mutex Lock 的获取。原创 2021-03-15 21:40:10 · 136 阅读 · 1 评论 -
线程池作用、用法以及原理
线程池作用用法建议设定大小快捷构造线程池submit与executeshutdown与shutdownNow代码底层原理继承关系ThreadPoolExecutor类主要参数工作原理饱和策略作用降低资源消耗,减少增加与销毁线程的操作提高响应速度提高线程的可管理性用法使用ThreadPoolExecutor构造线程池,将线程传入需要设定特殊参数,如核心线程池大小、最大线程池大小、缓冲队列大小等建议设定大小1、CPU计算较多的时候,设置为N+1,N为CPU个数2、IO操作较多时,设置为2*N原创 2021-03-16 21:05:31 · 7553 阅读 · 1 评论 -
如何手写单例
普通的单例单例模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象class Single { //1,构造一个该类的实例对象 private static Single sin = new Single(); //2,私有化构造方法 private Single(){} //3,定义一个返回函数 public static Single getIns原创 2021-04-11 20:55:59 · 365 阅读 · 0 评论 -
简单了解并发集合
阻塞队列的意思是,该队列在被清空的时候自动阻塞拿取元素的方法,队列在满的时候自动阻塞存放元素的方法,优点是我们不用去关心底层的同步问题,可以用于解决生产者消费者。3,如果当前位置的 MOVED == -1,则需要进行扩容,如果都不满足会用 synchronized 锁写入数据,synchronized 只锁定当前链表或红黑二叉树的首节点,这样只要 hash 不冲突,就不会产生并发。2,再次检查计算得到的指定位置的Segment是否为null,使用创建的HashEntry数组初始化这个Segment。原创 2021-04-15 21:16:21 · 357 阅读 · 0 评论 -
生产者消费者问题
多线程的问题可以拆分成四个部分,从这四个方面来考虑并发执行时是否会出现问题:1,原子性:在进行关键操作时,比如进行增加删除操作时,代码块部分是否只能被一个线程访问2,可见性:共享变量是否在所有线程中可见3,有序性:已经上锁的代码块被线程访问时,未上锁的代码块查看共享变量是否会出现脏数据4,线程之间的通信:所有线程是否有一套完整的唤醒与等待的机制因为Atomic类、AQS组件使用起来没有那么顺手,在遇到多线程题目时未必能反应过来,不如掌握两种简单的方法,在以后遇到问题时以不变应万变第一种synch原创 2021-04-16 16:43:47 · 61 阅读 · 0 评论