
并发编程
文章平均质量分 86
阿瑞的博客
你请不必打听我大名,望望无尽夜星,仍旧照亮你这一刹心境
展开
-
有了InheritableThreadLocal为啥还需要TransmittableThreadLocal?
典型回答InheritableThreadLocal是用于主子线程之间参数传递的,但是,这种方式有一个问题,那就是必须要是在主线程中手动创建的子线程才可以,而现在池化技术非常普遍了,很多时候线程都是通过线程池进行创建和复用的,这时候InheritableThreadLocal就不行了。TransmittableThreadLocal是阿里开源的一个方案 () ,这个类继承并加强InheritableThreadLocal类。原创 2023-10-27 15:53:19 · 302 阅读 · 0 评论 -
并发编程总结
偏向所锁,轻量级锁都是乐观锁,重量级锁是悲观锁。一个对象刚开始实例化的时候,没有任何线程来访问它的时候。它是可偏向的,意味着,它现在认为只可能有一个线程来访问它,所以当第一个线程来访问它的时候,它会偏向这个线程,此时,对象持有偏向锁。偏向第一个线程,这个线程在修改对象头成为偏向锁的时候使用CAS操作,并将对象头中的ThreadID改成自己的ID,之后再次访问这个对象时,只需要对比ID,不需要再使用CAS在进行操作。原创 2023-05-31 23:56:19 · 956 阅读 · 0 评论 -
JUC源码系列-AQS独占锁获取
AQS(AbstractQueuedSynchronizer)是JAVA中众多锁以及并发工具的基础,其底层采用乐观锁,大量使用了CAS操作, 并且在冲突时,采用自旋方式重试,以实现轻量级和高效地获取锁。AQS虽然被定义为抽象类,但事实上它并不包含任何抽象方法。这是因为AQS是被设计来支持多种用途的,如果定义抽象方法,则子类在继承时必须要覆写所有的抽象方法,这显然是不合理的。原创 2023-04-15 17:05:31 · 589 阅读 · 0 评论 -
JUC源码系列-CyclicBarrier源码分析
本篇我们来看看另一个和它比较像的并发工具CyclicBarrier。CyclicBarrier实现了类似CountDownLatch的逻辑,它可以使得一组线程之间相互等待,直到所有的线程都到齐了之后再继续往下执行。CyclicBarrier基于条件队列和独占锁来实现,而非共享锁。CyclicBarrier可重复使用,在所有线程都到齐了一起通过后,将会开启新的一代。CyclicBarrier使用了。原创 2023-04-15 18:24:37 · 944 阅读 · 0 评论 -
JUC源码系列-Semaphore源码研读
Semaphore(信号量)也是常用的并发工具之一,它常常用于流量控制。通常情况下,公共的资源常常是有限的,例如数据库的连接数。使用Semaphore可以帮助我们有效的管理这些有限资源的使用。Semaphore的结构和ReentrantLock以及CountDownLatch很像,内部采用了公平锁与非公平锁两种实现,如果你已经看过了ReentrantLock源码分析 和 CountDownLatch源码分析,弄懂它将毫不费力。Semaphore是一个有效的流量控制工具,它基于AQS共享锁实现。原创 2023-04-16 00:17:19 · 302 阅读 · 0 评论 -
JUC源码系列-ReentrantReadWriteLock
(1)首先说一下公平锁和非公平锁的区别,公平锁:当线程发现已经有线程在排对获取锁了,那么它必须排队,除了一种情况就是,线程已经占有锁,此次是重入,不用排队。非公平锁:只有一种情况需排队,其他情况不用排队就可以尝试获取锁: 如果当前全局处于读锁状态,且等待队列中第一个等待线程想获取写锁,那么当前线程能够获取到读锁的条件为:当前线程获取了写锁,还未释放;当前线程获取了读锁,这一次只是重入读锁而已;其它情况当前线程入队尾。原创 2023-04-15 18:37:02 · 714 阅读 · 0 评论 -
JUC源码系列-ReentrantLock源码研读
上一篇我们学习了lock接口,本篇我们就以ReentrantLock为例,学习一下Lock锁的基本的实现。Lock 接口ReentrantLock 实现lock()tryLock()unlock()从表中可以看出,ReentrantLock对于Lock接口的实现都是直接“转交”给sync对象的。ReentrantLock对于Lock接口方法的实现大多数是直接调用了AQS的方法,AQS中已经完成了大多数逻辑的实现,子类只需要直接继承使用即可,这足见AQS在并发编程中的地位。原创 2023-04-15 18:35:37 · 699 阅读 · 0 评论 -
JUC源码系列-Lock 和 Condtion
前面几篇我们学习了synchronized同步代码块,了解了java的内置锁,并学习了监视器锁的wait/notify机制。在大多数情况下,内置锁都能很好的工作,但它在功能上存在一些局限性,例如无法实现非阻塞结构的加锁规则等。为了拓展同步代码块中的监视器锁,java 1.5 开始,出现了lock接口,它实现了可定时、可轮询与可中断的锁获取操作,公平队列,以及非块结构的锁。与内置锁不同,Lock是一种显式锁,它更加“危险”,因为在程序离开被锁保护的代码块时,不会像监视器锁那样自动释放,需要我们手动释放锁。原创 2023-04-15 18:33:46 · 695 阅读 · 0 评论 -
JUC源码系列-CountDownLatch源码研读
CountDownLatch是一个很有用的工具,latch是门闩的意思,该工具是为了解决某些操作只能在一组操作全部执行完成后才能执行的情景。例如,小组早上开会,只有等所有人到齐了才能开;再如,游乐园里的过山车,一次可以坐10个人,为了节约成本,通常是等够10个人了才开。CountDown。原创 2023-04-15 18:21:01 · 457 阅读 · 0 评论 -
JUC源码系列-AQS共享锁的获取与释放
共享锁与独占锁的最大不同,是共享锁可以同时被多个线程持有,虽然AQS里面没有成员用来保存持有共享锁的线程们。由于共享锁在获取锁和释放锁时,都需要唤醒head后继,所以将其逻辑抽取成一个的逻辑了。原创 2023-04-15 18:18:37 · 451 阅读 · 0 评论 -
JUC源码系列-AQS的Condition的接口实现
本篇文章是基于线程间的同步与通信(4)——Lock 和 Condtion 这篇文章写的,在那篇文章中,我们分析了Condition接口所定义的方法,本篇我们就来看看AQS对于Condition接口的这些接口方法的具体实现。Object 方法Condition 方法区别时间单位,返回值时间单位,参数类型,返回值Condition独有Condition独有这里先做一下说明,本文说wait方法时,是泛指wait()三个方法,当需要指明某个特定的方法时,会带上相应的参数。原创 2023-04-15 17:02:32 · 513 阅读 · 0 评论 -
JUC源码系列-ReentrantLock独占锁的释放
try {// 更新对象 //捕获异常 } finally {一定要记得在 finally 块中释放锁!!!原创 2023-04-15 12:07:58 · 900 阅读 · 0 评论 -
Synchronized修饰同步非静态方法、同步静态方法、同步代码块的区别
某个类Object中的某个静态方法staticMethod加上同步锁之后,当某个线程 Thread 调用staticMethod时该线程会获取Object类的锁(当前Object的锁没被其它线程获取时,若当前Object锁被其它锁获取则会进行等待。:某个类Object中的某个非静态方法Method加上同步锁之后,当某个线程Thread调用Method时会获取所对应的Object对象的锁,此时其他线程在Thread释放锁前都无法调用该对象中的任何同步非静态方法(所有非静态同步方法都共用其所属的对象的锁)原创 2023-04-15 00:56:45 · 354 阅读 · 0 评论 -
并发编程之CompletableFuture全网最细最全用法(一)
并发编程CompletableFuture api 讲解源码解读原创 2022-09-20 16:53:49 · 4916 阅读 · 0 评论 -
Semaphore、CyclicBarrier和CyclicBarrier的区别
AQS 组件总结。Semaphore(信号量)-允许多个线程同时访问: synchronized 和 ReentrantLock 都是一次只允许一个线程访问某个资源,Semaphore(信号量)可以指定多个线 程同时访问某个资源。CountDownLatch (倒计时器): CountDownLatch 是一个同步工具类,用来 协调多个线程之间的同步。这个工具通常用来控制线程等待,它可以让某一个 线程等待直到倒计时结束,再开始执行。CyclicBarrier(循环栅栏): CyclicBarrier原创 2021-05-19 21:21:46 · 383 阅读 · 0 评论 -
synchronized关键字详解
锁的对象synchronized关键字“给某个对象加锁”,示例代码:等价于:实例方法的锁加在对象myClass上;静态方法的锁加在MyClass.class上。锁的本质如果一份资源需要多个线程同时访问,需要给该资源加锁。加锁之后,可以保证同一时间只能有一个线程访问该资源。资源可以是一个变量、一个对象或一个文件等。锁是一个“对象”,作用如下:这个对象内部得有一个标志位(state变量),记录自己有没有被某个线程占用。最简单的情况是这个state有0、1两个取值,0表示没有线程占用这个锁原创 2021-04-24 13:52:49 · 230 阅读 · 0 评论 -
java多线程题目详解
1. 什么是CAS答:CAS全称是Compare And Swap,即比较替换,是实现并发应用到的一种技术。操作包含三个操作数—内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作。CAS存在三大问题:ABA问题,循环时间长开销大,以及只能保证一个共享变量的原子操作2. CyclicBarrier和CountDownLatch区别答:CountdownLatch适用于所有线程通过某一点后通知方法,而Cycli原创 2021-04-22 21:48:52 · 246 阅读 · 2 评论