并发
文章平均质量分 95
_院长大人_
这个作者很懒,什么都没留下…
展开
-
JUC高级十二-ReentrantLock、ReentrantReadWriteLock、StampedLock
写锁和读锁是互斥的(这里的互斥是指线程间的互斥,当前线程可以获取到写锁又获取到读锁,但是获取到了读锁不能继续获取写锁),这是因为读写锁要保持写操作的可见性。因为,如果允许读锁在被获取的情况下对写锁的获取,那么正在运行的其他读线程无法感知到当前写线程的操作。因此,分析读写锁ReentrantReadWriteLock,会发现它有个潜在的问题:读锁全完,写锁有望;写锁独占,读写全堵;如果有线程正在读,写线程需要等待读线程释放锁后才能获取写锁。原创 2023-04-23 18:30:11 · 555 阅读 · 0 评论 -
JUC高级十-并发加锁原理之AbstractQueuedSynchronizer(AQS)
如果共享资源被占用,就**需要一定的阻塞等待唤醒机制来==保证锁分配==**。这个机制主要用的是CLH队列的变体实现的,**将暂时获取不到锁的线程加入到队列中**,这个队列就是AQS的抽象表现。它将请求共享资源的线程封装成队列的结点(`Node`),通过`CAS`、`自旋`以及`LockSupport.park()`的方式,维护`state变量`的状态,使并发达到同步的效果。原创 2023-04-15 16:08:38 · 629 阅读 · 0 评论 -
JUC高级九-Synchronized与锁升级
为求平衡将synchronized优化为不在是无所和重锁两个状态,新增偏向锁和轻量级锁来平衡安全性和性能问题synchronized锁:由对象头中的Mark Word根据的不同而被复用及锁升级策略。原创 2023-04-15 09:21:00 · 533 阅读 · 0 评论 -
JUC高级八-Java对象内存布局和对象头
在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:`对象头(Header)`、`实例数据(Instance Data)`和对齐填充`(Padding)`(保证8个字节的倍数) 。原创 2023-04-09 11:04:57 · 522 阅读 · 0 评论 -
JUC高级七-ThreadLocal线程局部变量
ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问**ThreadLocal实例的时候(通过其get或set方法)都有自己的、独立初始化的==变量副本==**。ThreadLocal实例通常是类中的私有静态字段,使用它的目的是希望将状态(例如,用户ID或事务ID)与线程关联起来。原创 2023-04-08 14:07:17 · 488 阅读 · 0 评论 -
JUC高级六:CAS和原子类
CAS的缩写,中文翻译成比较并交换,**实现并发算法时常用到的一种技术。**它包含三个操作数——内存位置预期原值及更新值。如果相匹配,那么处理器会自动将该位置值更新为新值,如果不匹配,处理器不做任何操作,多个线程同时执行CAS操作只有一个会成功。只需要记住:CAS是靠硬件实现的从而在硬件层面提升效率,最底层还是交给硬件来保证原子性和可见性实现方式是基于硬件平台的汇编指令,在intel的CPU中(X86机器上),使用的是汇编指令cmpxchg指令。原创 2023-04-02 11:52:27 · 499 阅读 · 0 评论 -
JUC高级五-volatile与Java内存模型
*read(读取)→load(加载)→use(使用)→assign(赋值)→store(存储)→write(写入)**→lock(锁定)→unlock(解锁)原创 2023-03-25 15:35:30 · 520 阅读 · 0 评论 -
JUC高级四:Java内存模型之JMM
虽然解决了线程安全的问题,但是读和写的并发量都下降了在Java 语言里面,Happens-Before 的语义本质上是一种可见性A Happens-Before B意味着A发生过的事情对B来说是可见的,无论A事件和B事件是否发生在同一个线程里.JMM的设计分为两部分:一部分是面向我们程序员提供的,也就是happens-before规则,它通俗易懂的向我们程序员阐述了一个强内存模型,我们只要理解happens-before规则,就可以编写并发安全的程序了。原创 2023-03-25 12:27:09 · 548 阅读 · 0 评论 -
JUC高级三:LockSupport与线程中断
首先一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。其次在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制——中断。中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。原创 2023-03-19 15:51:29 · 506 阅读 · 0 评论 -
JUC高级二: Java锁(上篇)
锁一锁二一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了,其它的线程都只能等待,换句话说,某一个时刻内,只能有唯一的一个线程去访问这些synchronized方法锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的synchronized方法锁三锁四加个普通方法后发现和同步锁无关换成两个对象后,不是同一把锁了,情况立刻变化,即两把锁不会锁住对方锁五锁六对于。原创 2023-03-19 13:31:31 · 503 阅读 · 0 评论 -
JUC高级一: CompletableFuture
Future对于结果的获取不是很友好,只能通过阻塞或轮询的方式得到任务的结果。对于简单的业务场景使用Future完全可以.但最好使用轮询方式Future优化思路(完成一些复杂的任务)回调通知Future任务完成了可以告诉我们,也就是我们的回调通知创建异步任务 :Future+线程池配合多个任务前后依赖可以组合处理想将多个异步任务的计算结果组合起来,后一个异步任务的计算结果需要前一个异步任务的值将两个或多个异步计算合成一个异步计算,这几个异步计算相互独立,同时后面这个又依赖前一个处理的结果。原创 2023-03-11 14:48:34 · 818 阅读 · 0 评论