JUC高级
文章平均质量分 93
JUC高级部分
鲨瓜2号
更多笔记:yzgc.top
展开
-
README
尚硅谷JUC并发编程尚硅谷周阳JUC编程。原创 2022-12-08 22:30:38 · 436 阅读 · 0 评论 -
第十二章:synchronized与锁升级
阿里巴巴规范:用锁能够实现数据的安全性,但是会带来性能下降。无锁能够基于线程并行提升程序性能,但是会带来安全性下降。求平衡???synchronized锁:由对象头中的Mark Word根据锁标志位的不同而被复用及锁升级策略java5 以前,只有Synchronized,这个是操作系统级别的重量级操作。使用synchronized 时,需要用户态和内核态之间的切换java的线程是映射到操作系统原生线程之上的,如果要阻塞或唤醒一个线程就需要操作系统介入,需要在用户态与核心态之间切换,这种切换会消耗大量的系原创 2022-12-05 08:49:29 · 298 阅读 · 0 评论 -
第十四章: ReentrantLock、ReentrantReadWriteLock、StampedLock
线程获取读锁是不能直接升级为写入锁的。不可锁升级在ReentrantReadWriteLock中,当读锁被使用时,如果有线程尝试获取写锁,该写线程会被阻塞。所以,需要释放所有读锁,才可获取写锁,即ReadWriteLock读的过程中不允许写,只有等待线程都释放了读锁,当前线程才能获取写锁,也就是写入必须等待,这是一种悲观的读锁。原创 2022-12-08 22:22:45 · 433 阅读 · 0 评论 -
第十三章:AQS
AQS 全称: ,字面意思:抽象队列同步器。位于 包下:是一个抽象类AQS 是什么?AQS 是用来实现锁或者其它同步器组件的公共基础部分的抽象实现,是重量级基础框架及整个JUC体系的基石,通过内置的FIFO队列来完成资源获取线程的排队工作,并通过一个int类变量表示持有锁的状态队列的结构:CLH:Craig、Landin and Hagersten 队列,是一个单向链表,AQS中的队列是CLH变体的虚拟双向队列FIFO官方解释:这么说有点抽象,举个例子:比如银行办理业务,一个窗口只能有一个人办理业务,此时原创 2022-12-06 22:50:49 · 397 阅读 · 0 评论 -
第十一章:Java对象内存布局和对象头
运行时元数据(对象标记)Mark World,包括:mark word(64位)分布图,对象布局、GC回收和后面的锁升级就是对象标记MarkWord里面标志位的变化类型指针(类元数据)Klass Pointer对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。存放类的属性(Field)数据信息,包括父类的属性信息,这部分内存按4字节对齐。虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐,这部分内存按8字节补充对齐。Customer对象头占用原创 2022-11-30 18:08:19 · 327 阅读 · 0 评论 -
第十章:聊聊ThreadLocal
ThreadLocalMap从字面上就可以看出这是一个保存ThreadLocal对象的map(其实是以ThreadLocal为Key),不过是经过了两层包装的ThreadLocal对象:JVM内部维护了一个线程版的Map(通过ThreadLocal对象的set方法,结果把ThreadLocal对象自己当做key,放进了ThreadLoalMap中。原创 2022-11-30 18:06:40 · 656 阅读 · 0 评论 -
第九章: 原子操作类
AtomicLong特点线程安全,可允许一些性能损耗,要求高精度时可使用。保证精度,性能代价AtomicLong是多个线程针对单个热点值value进行原子操作CAS+自旋低并发下的全局计算AtomicLong能保证并发情况下计数的准确性,其内部通过CAS来解决并发安全性的问题。高并发后性能急剧下降N个线程CAS操作修改线程的值,每次只有一个成功过,其它N - 1失败,失败的不停的自旋直到成功,这样大量失败自旋的情况,一下子cpu就打高了。LongAdder。原创 2022-11-29 19:17:42 · 107 阅读 · 0 评论 -
第七章:volatile与JMM
被 volatile 修饰的变量,具有了以下特征:可见性、禁排序、不能保证原子性volatile 可见性写操作的话,这个变量的最新值会立即刷新回到主内存中读操作的话,总是能够读取到这个变量的最新值,也就是这个变量最后被修改的值当某个线程收到通知,去读取volatile修饰的变量的值的时候,线程私有工作内存的数据失效,需要重新回到主内存中去读取最新的数据。不能保证原子性禁止指令重排序volatile 写volatile 读volatile 是如何 和 内存屏障相关联的?内存屏障是什么?原创 2022-11-26 21:54:24 · 106 阅读 · 0 评论 -
第八章:CAS
原子类有原子整型,原子布尔型…那么可不可以使用我们自定义的类型。是可以的,在 jdk 中提供了类,该类可以指向我们自定义的类型代码示例User li4 = new User("李四" , 3);// 比较并交换 System . out . println(atomicReference . compareAndSet(z3 , li4) + "\t" + atomicReference . get() . toString());}true User(name=李四, age=3)原创 2022-11-26 20:54:53 · 108 阅读 · 0 评论 -
第六章:Java内存模型之JMM
Java中普通的共享变量不保证可见性,因为数据修改被写入内存的时机是不确定的,多线程并发下很可能出现**“脏读”**,所以每个线程都有自己的工作内存,线程自己的工作内存中保存了该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取,赋值等 )都必需在线程自己的工作内存中进行,而不能够直接读写主内存中的变量。:假设存在线程A和B,线程A先(时间上的先后)调用了setValue(),然后线程B调用了同一个对象的getValue(),那么线程B收到的返回值是什么?推导出我们需要知道JMM。原创 2022-11-25 21:31:20 · 448 阅读 · 0 评论 -
第五章:LockSupport与线程中断
首先一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,都已经被废弃了。其次在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java 提供了一种用于停止线程的协商机制——中断。中断只是一种协作协商机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的 interrupt 方法,该方法也仅仅是将线程对象的中断标识设成true;原创 2022-11-25 21:29:36 · 350 阅读 · 0 评论 -
第四章:Java琐事
指针指向monitor对象(也称为管程或监视器锁)的起始地址。每个对象都存在着一个monitor与之关联,当一个monitor被某个线程持有后,它便处于锁定状态。在Java虚拟机(HotSpot)中,monitor是由ObjectMonitor实现的,其主要数据结构如下(位于HotSpot虚拟机源码ObjectMonitor.hpp,C++实现的)指针指向monitor对象(也称为管程或监视器锁)的起始地址。每个对象都存在着一个monitor与之关联,当一个monitor被某个线程持有后,它便处于锁定状态。原创 2022-11-25 21:28:02 · 581 阅读 · 0 评论 -
第三章:CompletableFuture
Future接口(FutureTask实现类)定义了操作异步任务的一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。(异步:可以被叫停,可以被取消)比如主线程让一个子线程去执行任务,子线程可能比较耗时,启动子线程开始执行任务后,主线程就去做其他事情了,过了一会才去获取子任务的执行结果。在我们学多线程时,创建多线程一共有四种方式:而我们要使用多线程实现 , 就需要具有以下三个特点:多线程/有返回/异步任务在以上的集中创建方式中,只有 实现Callable 接口,原创 2022-11-25 21:26:40 · 425 阅读 · 0 评论 -
第二章:线程基础知识复习
摩尔定律它是由英特尔创始人之一-Gordon Moore(戈登●摩尔)提出来的。其内容为: .当价格不变时,集成电路上可容纳的元器件的数目约每隔18-24个月便会增加一倍,性能也将提升一倍。换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻- -倍以 上。这-一定律揭示了信息技术进步的速度。可是从2003年开始CPU主频已经不再翻倍,而是采用多核而不是更快的主频。摩尔定律失效了,0(T_ τ)o在主频不再提高且核数在不断增加的情况下,要想让程序更快就要用到。原创 2022-11-25 21:24:10 · 407 阅读 · 0 评论