Java
文章平均质量分 74
Hello Java
山与长生
Maybe in another lifetime, you and I would find a way to make it
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java多线程总结(三):[Lock]ReentrantLock
对于ReentrantLock来说,它本身是Lock接口的一个实现,AQS只是它使用的工具,所以,我们的思路是从Lock的角度切入,搞清楚它是如何利用AQS实现这套锁机制的。原创 2025-02-06 09:23:54 · 591 阅读 · 0 评论 -
Java多线程总结(三):[AQS]3. 条件队列相关代码解析
又已知Java的锁机制是参考MESA,所以我们推测J.U.C.中相关逻辑框架应与上面描述的基本一致。原创 2025-02-06 09:17:46 · 470 阅读 · 0 评论 -
Java多线程总结(三):[AQS]2. 资源释放的代码解析
基本上所有的操作都在其中了,所以在资源释放的时候只需要唤醒后续节点就可以,甚至,共享资源的释放过程在当初获取资源的时候都可能执行过一次了。原创 2025-02-06 09:16:20 · 262 阅读 · 0 评论 -
Java多线程总结(三):[AQS]0. 方法一览与CLH队列
CLH队列最显著的特点是当前节点是在前置节点的lock字段上自旋,因此CLH队列的离队操作非常简洁。同时我们注意到,因为它要基于前置节点自旋,所有它获取到的前置节点永远都是非空的,这点在代码中表现为tail节点有默认值,且从不置空,类似的,在AQS中的head节点除了初始化前之外也都是非空的。CLH的入队操作和离队操作都比较简单,入队只需要通过CAS将tail指向当前节点,之后再前置节点的lock字段上自选,离队只需要将当前节点的lock状态置为false即可。一般为模板方法,包含扩展点和执行逻辑。原创 2025-02-05 21:24:09 · 665 阅读 · 0 评论 -
Java多线程总结(三):[AQS]1. 资源获取的代码解析
从这个角度讲,不管是排他锁还是共享锁,唤醒后续节点都是不会产生错误的,只是会影响性能。已知AQS队列是一个双链,入队操作本身的逻辑只是“在保证head初始化的前提下,通过CAS将新节点变成新的tail,同时维护双链表结构”,这部分代码是各种类型的acquire的公用的代码,其逻辑也比较简单,见下。tryAcquireNanos与tryAcquireSharedNanos是两个有超时时间的获取锁的方法,作为api层依然没什么逻辑,但我们注意到,带有超时时间的获取锁的方法,他们对中断的处理可能都是抛出异常。原创 2025-02-05 21:01:07 · 527 阅读 · 0 评论 -
Java多线程总结(二):volatile与Synchronized
volatile保证的是可见性和有序性对于volatile的读操作,注意到:可以理解为volatile变量在读之后会加上loadload屏障和loadstore屏障关于里面的fence:什么是IRIW和MCA(multi-copy atomicity)对于volatile字段的写操作,注意到两点:可以理解为volatile变量在写之前加入了loadstore和storestore,在写之后加入了storeload 总结一下:代码在hotspot/src/share/vm/interpreter原创 2025-01-31 14:48:05 · 917 阅读 · 0 评论 -
Java多线程总结(一):一些理论基础
缓存一致性的问题通常需要硬件支持,会有硬件性能损耗,并且随着CPU数量的增加而增加,比如一个96核的服务器,每个CPU运行一个线程,每个线程访问同一个变量V,当其中一个线程对V做出修改时,会把消息广播到其余的CPU上,这会造成极大的硬件性能损耗,所以SMP技术很难组件大规模的CPU系统。,它相当于一个暂存数据,有了它之后,CPU发出对应的指令后,不再同步等待响应,而是先把数据写入StoreBuffer,之后继续执行后面的指令,之后择机将StoreBuffer的数据刷回缓存行。原创 2025-01-29 20:42:39 · 1858 阅读 · 0 评论 -
线程start之后发生了什么
// 注意这里是加了锁的,保证了线程安全// 避免多个线程同时对一个线程调用start,从而导致非NEW状态的线程再次startpublic synchronized void start() { /** * This method is not invoked for the main method thread or "system" * group threa...原创 2020-01-12 19:59:02 · 690 阅读 · 0 评论 -
new一个Thread之后发生了什么
Thread的构造器都是调用了init方法,所以我们来看一下init方法private void init(ThreadGroup g, Runnable target, String name, long stackSize, AccessControlContext acc, ...原创 2020-01-12 19:35:33 · 470 阅读 · 0 评论
分享