JUC
文章平均质量分 96
匍匐、前行
这个作者很懒,什么都没留下…
展开
-
【尚硅谷周阳--JUC并发编程】【第十四章--ReentrantLock、ReentrantReadWriteLock、StampedLock讲解】
ReentrantReadWriteLock实现了读写分离,但是一旦读操作比较多的时候,想要获取写锁就变得比较困难了,假如当前1000个线程,999个读,1个写,有可能999个读取线程长时间抢到了锁,那1个写线程就悲剧了,因为当前有可能会一直存在读锁,而无法获得写锁,根本没有机会。原创 2024-03-30 17:58:21 · 648 阅读 · 0 评论 -
【尚硅谷周阳--JUC并发编程】【第十三章--AbstractQueuedSynchronizer之AQS】
Semaphore以上四个他们底层都是继承自AbstractQueuedSynchronizerAQS同步队列的基本结构有阻塞就需要排队,实现排队必然需要队列state变量+CLH双端队列。原创 2024-03-28 20:50:40 · 745 阅读 · 0 评论 -
【尚硅谷周阳--JUC并发编程】【第十二章--Synchronized与锁升级】
偏向锁:适用于单线程使用的情况,在不存在竞争的时候进入同步方法/代码块则使用偏向锁。轻量级锁:适用于竞争较不激烈的情况(这和乐观锁的使用范围类似),存在竞争时升级为轻量级锁,轻量级锁采用的是自旋锁,如果同步方法/代码块执行时间很短的话,采用轻量级锁虽然会占用CPU资源但是相对比使用重量级锁还是更高效。重量级锁:适用于竞争激烈的情况,如果同步方法/代码块执行时间很长,那么使用轻量级锁自旋带来的性能消耗就比使用重量级锁更严重,这时候就需要升级为重量级锁。原创 2024-03-28 10:45:06 · 978 阅读 · 0 评论 -
【尚硅谷周阳--JUC并发编程】【第十一章--Java对象内存布局和对象头】
在HotSpot虚拟机里,对象在堆内存中的存储布局可以分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。原创 2024-03-25 16:38:25 · 928 阅读 · 1 评论 -
【尚硅谷周阳--JUC并发编程】【第十章--ThreadLocal】
1. ThreadLocal并不解决线程间共享数据的问题2. ThreadLocal适用于变量在线程间隔离且在方法间共享的场景3. ThreadLocal通过隐式的在不同线程内创建独立实例副本避免了实例线程安全的问题4. 每个线程持有一个只属于自己的专属Map并维护了ThreadLocal对象与具体实例的映射,该Map由于只被持有它的线程访问,故不存在线程安全以及锁的问题5. ThreadLocalMap的Entry对ThreadLocal的引用为弱引用,避免了ThreadLocal对象无法被回收的原创 2024-03-24 14:17:03 · 881 阅读 · 1 评论 -
【尚硅谷周阳--JUC并发编程】【第九章--原子操作类之18罗汉增强】
AtomicLong的自旋会称为瓶颈 N个线程CAS操作修改线程的值,每次只有一个成功过,其他N-1失败,失败的不停的自旋知道成功,这样大量失败自旋的情况,一下子CPU就打高了;LongAdder当需要在高并发下有较好的性能表现,且对值得精度要求并不高时,可以使用。保证性能,精度代价, LongAdder是每个线程拥有自己的槽,各个线程一般只对自己槽中的那个值进行CAS操作原创 2024-03-21 21:58:13 · 429 阅读 · 1 评论 -
【尚硅谷周阳--JUC并发编程】【第八章--CAS】
CAS会导致“ABA问题”;CAS算法实现一个重要前提需要取出内存中某时刻的数据并在当下时刻比较并替换,那么在这个时间差内会导致数据的变化。比如说一个线程1从内存位置V中取出A,这时候另一个线程2也从内存中取出A,并且线程2进行了一些操作将值编程了B,然后线程2又将V位置的数据编程A,这时候线程1进行CAS操作发现内存中任然是A,预期没有问题,然后线程1操作成功。尽管线程1的CAS操作成功,但是不代表这个过程就是没有问题的。原创 2024-03-19 19:46:29 · 569 阅读 · 1 评论 -
【尚硅谷周阳--JUC并发编程】【第七章--volatile与JMM】
通过内存屏障禁重排重排有可能影响程序的执行和实现,因此,我们有时候希望告诉JVM你别“自作聪明”给我重排序,我这里不需要重排序对于编译器的重排序,JMM会根据重排序的规则,禁止特定类型的编译器重排序对于处理器的重排序,Java编译器在生成指令序列的适当位置,插入内存屏障指令,来禁止特定类型的处理器排序。写指令。原创 2024-03-18 17:39:44 · 1007 阅读 · 0 评论 -
【尚硅谷周阳--JUC并发编程】【第六章--Java内存模型之JMM】
我们定义的所有共享变量都存储在屋里主内存中每个线程都有自己独立的工作内存,里面保存该线程使用到的变量的副本(主内存中该变量的一份拷贝)线程对共享变量所有的操作都必须先在线程自己的工作内存中进行后回写主内存,不能直接从主内存中读写(不能越级)不同线程之间也无法直接访问其他线程的工作内存中的变量,线程间变量值的传递需要通过主内存来进行(同级不能互相访问)Java语言里面,Happens-before的语义本质是一种可见性A Happens-Before B意味着A发生过的事情对B来说是可见的。原创 2024-03-13 21:05:47 · 803 阅读 · 0 评论 -
【尚硅谷周阳--JUC并发编程】【第五章--LockSupport与线程中断】
LockSupport是用来创建锁和其他同步类的基本线程阻塞原语;LockSupport是一个线程阻塞工具,所有的方法都是静态方法,可以让线程在任意位置阻塞,阻塞之后也有对应的唤醒方法。归根结底,LockSupport调用的unsafe中的native代码;LockSupport提供park()和unpark()方法实现阻塞线程和解除线程阻塞的过程,LockSupport和每个使用它的线程都有一个许可(permit)关联。每个线程都有一个相关的permit,permit最多只有一个原创 2024-03-13 12:08:14 · 856 阅读 · 0 评论 -
【尚硅谷周阳--JUC并发编程】【第四章--锁】
认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。synchronized关键字和Lock的实现都是悲观锁认为自己在使用数据时不会有别的线程修改数据表资源,所以不会添加锁在Java中是通过使用无锁编程来实现,只是在更新数据的时候取判断,之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入如果这个数据已经被其他线程更新,则根据不同的实现方式执行不同的操作,比如放弃修改、重试抢锁等等。原创 2024-03-07 21:11:16 · 897 阅读 · 0 评论 -
【尚硅谷周阳--JUC并发编程】【第二章--线程基础知识】【第三章--CompletableFuture】
Java线程基础知识及CompletableFuture介绍原创 2024-03-05 22:27:23 · 899 阅读 · 0 评论