![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JUC
文章平均质量分 77
smartjiang-java
我是个菜鸡,我在追彩虹.
展开
-
volatile和synchronized的底层实现原理
文章目录一:volatile1:字节码层面2:JVM层面3:CPU层面层面二:synchronized1:字节码层面2:JVM层面3:CPU层面一:volatile关于volatile的功能无非是两个:1:保证保证线程间变量的可见性2:防止指令重排序下面我们就从字节码层面,JVM层面,CPU层面来解析是如何做到的。1:字节码层面首先编写一个很简单的类:public class TestVolatile { int i; volatile int j;}编译并查看字节码:原创 2020-11-24 13:36:10 · 541 阅读 · 2 评论 -
多线程与高并发二:volatile和CAS详细介绍
1:上篇说了synchronized,但加锁一般会使效率降低,后来便有了锁优化。2:锁优化一般分两种锁细化:同步代码块中语句越少越好,只在必要同步的代码上加锁锁粗化:代码中加了多个细锁,不如在大块中加锁,减少代码争用3:但是效率问题还是可以使用更好的方法解决。比如使用volatile和CAS,也叫无锁,至于具体到底是不是锁,个人理解就好。A:volatile的作用a:保证线程间变量的可见性:会让所有线程会读到变量的修改值。线程共享堆内存,但每个线程都有一份自己的内存。当有两个线程访问堆内存中的原创 2020-07-14 19:02:35 · 359 阅读 · 2 评论 -
多线程与高并发五:等待队列及Executor和线程池详解
一:等待队列关于创建线程池的好处这里就不介绍了,直接上干货.首先,要想弄明白线程池,先要认识一些队列,这是线程池的基础.多线程容器,以后多考虑Queue,少考虑List,Set.这里来一道面试题:Queue相比较list比较好的地方? 有对多线程比较友好的接口,有以下方法:offer:----相当于add,会有返回值,成功了返回turepoll:取数据并且remove掉peek:取数据不remove掉BlockingQueue在线程池里是经常出现的队列:它是阻塞队列.多了下面的阻塞方法.p原创 2020-07-21 23:53:06 · 2882 阅读 · 1 评论 -
多线程与高并发四:VarHandle与强软弱虚引用和ThreadLocal
一:VarHandle上一篇说了AQS的源码,其中还有一个知识点VarHandle,看下面的代码大家会问:VarHandle是什么?有什么作用?其实:VarHandle是jdk1.9之后才出现的,表示指向某个变量的引用,可以完成原子性的线程安全操作可以通过cas方式进行比较设值。比反射快,直接操纵二进制码,反射每次操作前都要做检查二:强软弱虚引用博客部分内容引用:http://blog.csdn.net/liuxian13183强引用Object object=new Object();原创 2020-07-20 18:28:20 · 990 阅读 · 2 评论 -
多线程与高并发三:AQS底层源码分析及其实现类
上篇说了CAS和volatile,这一篇主要介绍综合了CAS和volatile的AQS。一:AQS1:AQS是AbstractQueuedSynchronizer的简称。有一个共享资源变量state:AQS state是一个volatile标志的Int整形数,支持多线程下的可见性。根据子类的不同取不同的意义。跟随着state的还有一个FIFO等待队列,是一个双向链表,一个节点中表示一个线程,有前节点,后节点。多线程竞争state被阻塞会进入此队列,实现方式为CAS。当等待队列中的一个节点拿到了stat原创 2020-07-18 21:03:55 · 344 阅读 · 2 评论 -
多线程与高并发一:开启线程与synchronized
1:关于多线程简单知识就不介绍了,从此篇开始介绍关于多线程的一些深入知识。这一篇主要介绍线程的开启和synchronized的一些使用。2:线程开启的三种方式:a:T1 Extends Thread 重写run()方法new T1().start();b::T2 Implements Runnable 重写run()方法new Thread(new T2()).start();c:通过线程池来启动(严格来说也是上面的两种)3:synchronizeda:syncyroni原创 2020-07-13 21:32:49 · 888 阅读 · 2 评论 -
AQS 之 CyclicBarrier 源码分析
1:字面意思是可循环使用(Cyclic)的屏障(Barrier)。让一组线程全部到达屏障时,屏障才会开门,被屏障拦截的线程才会继续运行。先到达的线程处于阻塞状态。2:使用场景:可以用于多线程计算数据,最后合并结果的场景。3:CountDownLatch的计数器只能使用一次,而CyclicBarrier的计数器可以使用reset()方法重置。4:一般和固定数目线程池配合使用,线程数目二者最好定义相同默认构造方法 :传入拦截的线程总数进入重载方法:另一个构造方法3:阻塞方法 await需要等待的线程原创 2022-06-08 18:09:04 · 186 阅读 · 0 评论 -
AQS 之 CountdownLatch 源码分析
1:CountDownLatch 允许一个或多个线程阻塞,等待其他线程完成操作。2:有一个计数器,表示需要等待的事件数量传入 int 整数,作为初始化计数器的值进入 Sync(count) 方法3:阻塞等待方法调用 await() 方法进入 acquireSharedInterruptibly(1) 方法进入 tryAcquireShared(1) 方法回到 acquireSharedInterruptibly(1) 方法进入 doAcquireSharedInterruptibly(1)原创 2022-06-08 16:21:37 · 100 阅读 · 0 评论 -
AQS 之 Semaphore 源码分析
信号量:用来限制能同时访问共享资源的线程上限。和锁不一样,锁只有一个共享资源;信号量的共享资源有多个,对访问的线程上限做限制。作用:可以做限流,只适合单机版,只限制线程数量,而不是限制资源数(tomcat 连接数)可以作用于数据库连接池,享元模式下的,性能和可读性更好Semaphore semaphore = new Semaphore(n);进入NonfairSync(permits) 方法调用父类的 NonfairSync(permits) 方法3:获取信号量调用 acquire()方法原创 2022-06-07 22:11:27 · 110 阅读 · 0 评论 -
AQS 之 ReentrantReadWriteLock 源码分析
1:读锁不支持条件变量,写锁支持2:重入时升级不支持:即持有读锁的情况下去获取写锁,会导致获取写锁永久等待3:重入时降级支持:即持有写锁的情况下允许去获取读锁(获取写锁前必须释放读锁)4:拥有两把锁,共用 AQS 的 state ,不同的是写锁状态占了 state 的低16位,而读锁使用的是 state 的高16位thread-0 调用 WriteLock 的 lock() 方法进入 acquire(1) 方法进入 tryAcquire(1) 方法2.2:thread-0 加读锁:成功我们假设原创 2022-06-07 17:43:12 · 96 阅读 · 0 评论 -
AQS之 ReentrantLock 源码分析
AQS,全称是 AbstractQueuedSynchronizer ,抽象类,是阻塞式锁和相关的同步器工具的框架。有以下特点:子类主要需要实现 AQS 中下面一些方法,默认抛出 UnsupportedOperationException由于 ReentrantLock 提供了两个同步器,实现公平锁 FairSync 和非公平锁 NonfairSync ,默认是非公平锁。假设当前只有 thread-0 线程来加锁,那么进入 lock() 方法此时又来了 thread-1 线程,同样先进入到 lock原创 2022-06-06 22:32:28 · 136 阅读 · 0 评论