并发
文章平均质量分 85
多线程并发编程的个人理解和记录
一届贫农
这个作者很懒,什么都没留下…
展开
-
异步编程之美——CompletableFuture
supplyAsync异步开启一个任务,并返回一个结果;入参为Supply函数式接口;CompletableFuture busA = CompletableFuture.supplyAsync(() -> { SmallTool.printTimeAndThread("A公车发车"); SmallTool.sleepMillis(3000); return "A公车到站";});SmallTool.printTimeAndThread(busA);thenComb原创 2021-08-22 22:12:50 · 272 阅读 · 0 评论 -
走进AQS体系(二)—— 条件队列
条件队列在 并发编程中是用于对一类事务在处理时机未到的情况下,让负责处理此类事务的线程进行阻塞,当时机成熟的时候,将其唤醒,使其继续往下处理这件事务;条件队列针对阻塞于某类条件的线程进行集中化的队列管理,能保证当该条件成熟了 ,这些线程能够按照有序的方式一个个转换到同步队列中;需要区分两种唤醒,条件队列的唤醒,是每次唤醒后会将其转换到同步队列,最终这些条件队列上的CONDITION节点都是转换到同步队列中的;同步队列的唤醒,是去争夺处理机,真正去执行线程内容;所以,第一个唤醒不考虑原创 2021-07-09 11:40:11 · 1839 阅读 · 0 评论 -
走进AQS体系(一)—— 独占模式下的AQS
1. 尝试获取资源(子类锁需要提供的自定义方法tryAcquire); 2. 获取不到资源,则入队(自旋+CAS直到入队成功); 3. 唤醒入队节点 (也是线程被阻塞的位置); 4. 如果入队节点的上一个节点是头节点,则直接尝试获取锁,如果获取成功就执行,并将其设置为头节点; 5. 如果尝试获取锁不成功或者上一个节点非头节点,则判断其是否应该park(额外的处理: 前一个节点为SIGNAL,应该直接park;前一个节点是CANCELLED节点,则调整节点为非CANCELLED节点的后继;前一个原创 2021-07-05 15:57:33 · 224 阅读 · 0 评论 -
jdk Future的使用方式
Future是什么在使用线程的时候,我们会理所当然的想到继承Thread或者实现Runnable,但这两种方式都存在着一个问题,无法返回执行结果。并且,继承Thread也会带来一个破坏面向对象原则的问题,即不符合里氏替换原则。为了解决此类问题,JDK1.5后引入了Future和Callable。Callable和Future首先,我们来观察一个Callable接口,它是一个支持泛型并且函数式编程的接口,在使用时我们仅需要实现它的call()方法。其次,我们再来看一下Future接口,各方法解释已原创 2020-09-13 14:32:09 · 550 阅读 · 0 评论 -
AQS底层源码浅析1(Deprecated)
自己学习AQS的一些总结,如果有不同见解的,欢迎评论一起探讨,如果有理解不到位的,希望能够帮我指正。AQS的代码设计真的很精巧,可能一个判断就已经包含了n多种含义。但理解了它,会让自己对并发的理解更上一个层次。state是一个锁标志位,是能否上锁,是否排队等所依托的一个重要属性。不同的锁对于该标志的实现也是有所区别的,例如ReentrantLock和ReentrantReadWriteLock;prev是引用了前一个节点,next是引用了下一个队列节点,简而言之,AQS的同步队列就是利用双向链表构建的一个队原创 2020-06-09 13:11:17 · 258 阅读 · 0 评论 -
ThreadLocal底层浅析
ThreadLocal结构ThreadLocal操作数据的真相首先,ThreadLocal并非有一个ThreadLocalMap属性,而是通过在调用get()/sety()/remove()方法时会通过Thread.currentThread()获取到当前线程,再通过此线程获取到该线程的threadLocals属性,当该属性为空时则会进行拆创建。如下代码所示:public void set(T value) { Thread t = Thread.currentThread();原创 2020-06-03 23:23:24 · 233 阅读 · 0 评论 -
java的四种引用类型
java提供的引用类型强引用(Strong):引用存在,则不会被回收。例如直接new出来后被引用的对象。软引用(Soft):在GC进行垃圾回收时,如果内存紧张,不够用的情况下会对这部分内存进行回收。弱引用(Weak):在下一轮GC进行垃圾回收时,该部分内存会被回收。如果存在A a = new A(new WeakReference©) 的时候,则需等待A的强引用消失了才会收集对于C的弱引用,也就是对象不可达才会按照虚引用得规则进行回收。虚引用(Phantom):随时有可能被回收掉。...原创 2020-06-02 21:26:27 · 195 阅读 · 0 评论 -
并发编程入门,关于wait()/notify(),sleep()的认识
wait()- 该方法的主要作用是当前线程进入等待状态,但这的前提是,当前线程已经获取了某个对象锁。 - 当线程进入等待状态后,可能会重新唤醒的条件有以下几种: 1、另一个线程调用了当前对象锁的notify()或者notifyAll()方法; 2、该线程的等待时间到达,如果是为零的话,这个条件失效; 3、其他线程调用了该线程的interrupt()方法无参数的wait(),其实这里是调用了wait(long timeout),只不过传入参数的为零,相当于没有超时时间的限制原创 2020-05-22 01:03:11 · 241 阅读 · 0 评论 -
Java多线程关于interrupt()的理解
interrupt()并不会终止线程,相反有的时候它能唤醒线程,isInterrupt()使用时会遇到的一些问题。原创 2020-05-21 13:44:53 · 381 阅读 · 0 评论