![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java并发
文章平均质量分 72
睿里睿气
全栈工程师
展开
-
Java连载148-Class常量池
一、常量池的分类字符串常量池、Class常量池、运行时常量池编译相关,java代码可以使用javac来进行编译成字节码,然后运行在java虚拟机上,生成字节码在linux机器上可以使用vim来进行打开,如果要以16进制的形式打开,则可以:%!xxd即可字节文件的前几个字符是cafe babe,这是java的魔数使用javap -v HelloWorld.class命令可以查看常量池内容常量池主要存放两种东西:字面量和符号引用二、class常量池有什么用Java代码在进行Javac编译的原创 2021-11-10 00:33:12 · 1001 阅读 · 0 评论 -
Java高并发28-ThreadPoolExecutor原理剖析(2)
线程池转换状态如下:Running->Shutdown 显示调用shutdown()或隐式调用finalize()中的shutdown()Running或者Shutdown->Stop 显示调用shutdownNow()Shutdown->Tidying 当线程池和任务队列都是空的时候Stop ->TidyingTidying -> Terminated线程池类型如下newFixedThreadPool创建一个核心线程数和最大线程个数为都为nThr原创 2021-07-30 00:03:47 · 58 阅读 · 0 评论 -
Java高并发27-ThreadPoolExecutor原理剖析(1)
类图线程池的好处:(1)性能好;(2)工厂方法便捷创建线程,个数自定义指定类图描述Excutors其实是一个工具类,ThreadPoolExecutor继承了AbstractExecutorService,成员变量ctl是一个Integer的原子变量,用来记录线程池的状态和线程池中的线程个数这个Integer原子变量,前三位代表的是线程池的状态,后面29位代表的是线程池中线程的个数private final AtomicInteger ctl = new AtomicInteger原创 2021-07-06 23:02:43 · 85 阅读 · 0 评论 -
Java高并发26-释放锁以及ReentrantLock实例演示
一、释放锁1.void unlock()方法尝试释放锁,如果当前线程持有锁,则调用该方法会让该线程对该线程持有的AQS状态值减1,如果减去1后当前状态值为0,则当前线程会释放该锁,否则仅仅减去1而已,如果当前线程没有持有该锁而调用了该方法就会抛出IllegalMonitorStateException异常,代码如下 public void unlock() { sync.release(); } public final boolean tryRelease( int releases原创 2021-04-16 00:05:58 · 242 阅读 · 2 评论 -
Java高并发25-独占锁ReentranLock的原理
一、类图结构ReentrantLock是一个可重入锁,只有一个线程可以获取到该锁,其他线程想要获取该锁的时候会被放到AQS队列中。从类图中可以看到实现了Lock接口,内含一个Sync类型变量,该类型是继承自AQS抽象类,同时又有两个继承了类,分别为公平锁和非公平锁。 Sync sync; public ReentrantLock() { sync = new NonfairLock(); } public ReentrantLock(boolean fair) { sync原创 2021-03-31 00:13:15 · 370 阅读 · 0 评论 -
Java高并发24-使用自定义锁生成一个消费模型
一、使用自定义锁实现生成–消费模型1.下面我们使用上节自定义的锁实现一个简单的生产–消费模型,代码如下:package com.ruigege.LockSourceAnalysis6;import java.util.Queue;import java.util.concurrent.locks.Condition;public class Test { final static NonReentrantLock lock = new NonReentrantLock(); final s原创 2021-03-05 00:19:58 · 108 阅读 · 2 评论 -
Java高并发22-AQS条件变量的支持
一、入队操作当一个线程获取锁失败之后会被转换为Node节点,然后会使用enq方法,将该节点插入到AQS的阻塞队列,下面看一下这个方法如何实现 private Node enq(final Node node) { for(;;) { Node t = tail; if( t == null) { if(compareAndSetHead(new Node())) { tail = head; } }else { node.prev = t;原创 2021-02-22 23:01:14 · 92 阅读 · 0 评论 -
Java高并发21-AQS在共享,独占场景下的源码介绍
七、源码:所在包:com.ruigege.ConcurrentListSouceCodeAnalysis5https://github.com/ruigege66/ConcurrentJavaCSDN:https://blog.csdn.net/weixin_44630050博客园:https://www.cnblogs.com/ruigege0000/欢迎关注微信公众号:傅里叶变换,个人账号,仅用于技术交流...原创 2021-01-31 18:55:18 · 157 阅读 · 0 评论 -
Java高并发20-并发包中锁原理解析(二)
一、例子下面来一个例子加深对park和unpark的理解package com.ruigege.LockSourceAnalysis6;import java.util.concurrent.locks.LockSupport;public class TestParkAndUnpark { public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(ne原创 2021-01-23 15:40:28 · 165 阅读 · 0 评论 -
Java高并发19-并发包中锁原理解析(一)
二、源码:所在包:com.ruigege.ConcurrentListSouceCodeAnalysis5https://github.com/ruigege66/ConcurrentJavaCSDN:https://blog.csdn.net/weixin_44630050博客园:https://www.cnblogs.com/ruigege0000/欢迎关注微信公众号:傅里叶变换,个人账号,仅用于技术交流...原创 2021-01-17 00:25:33 · 117 阅读 · 0 评论 -
Java高并发18-并发列表CopyOnWriteArrayList源码解析
一、CopyOnWriteArrayList概览:该List是一个JUC包中的唯一并发List,它是线程安全的,底层是一个数组,我们所有的操作都是使用了写时复制的策略,下面这张图片就是该类的一个类图1.类图基本解释有一个独占锁ReentrantLock用于锁定线程,同一时间只能由一个线程进行修改。2.初始化首先看无参构造函数,创建一个大小为0的数组 private transient volatile Object[] array; public CopyOnWriteA原创 2021-01-09 23:43:41 · 132 阅读 · 0 评论 -
Java高并发17-LongAccumulator类详解
一、LongAccumulator类1.和LongAdder之间的关系LongAdder类是LongAccumulator的一个特例,我们看一下LongAccumulator的一个构造方法 public LongAccumlator(LongBinaryOperator accumulatorFunction,long identity) { this.function = accumulatorFunction; base = this.identity = identity; }原创 2021-01-07 23:13:48 · 303 阅读 · 0 评论 -
Java高并发16-LongAdder类源码解析(下)
一、复习二、 final void longAccumulate(long x,LongBinaryOperator fn,boolean wasUncontended) { //初始化当前线程的变量threadLocalRandomProbe的值 int h; if(h = getProbe() == 0) { ThreadLocalRandom.current(); h = getProbe(); wasUncontended = true; } boolean原创 2021-01-05 23:45:43 · 119 阅读 · 0 评论 -
Java高并发16-LongAdder类源码解析(上)
一、复习二、三、源码:所在包:com.ruigege.AtomicOperationClass4https://github.com/ruigege66/ConcurrentJavaCSDN:https://blog.csdn.net/weixin_44630050博客园:https://www.cnblogs.com/ruigege0000/欢迎关注微信公众号:傅里叶变换,个人账号,仅用于技术交流...原创 2020-12-26 00:30:01 · 2150 阅读 · 4 评论 -
Java高并发15-AtomicLong等原子类源码解析
一、复习二、Java并发包中一些原子操作类的源码解析1.常见类例如AtomicLong,AtomicInteger,AtomicCharacter…等这些操作类其内部实现都是通过CAS非阻塞算法来实现, 因此我们只要弄懂一个其他就基本知晓了,因此本文讲解AtomicLong类的实现原理AtomicLong还有LongAdder,LongAccumulator等类是对AtomicLong特性的增强,我们后面再说2.AtomicLong类优点:使用CAS非阻塞算法实现并发,比使用synchro原创 2020-12-19 22:09:23 · 254 阅读 · 0 评论 -
Java高并发13-公平锁与非公平锁、自旋锁、可重入锁
一、复习二、公平锁与非公平锁按照线程请求并获得锁的时间顺序,可以将锁分为公平锁和非公平锁公平锁:线程获取锁的顺序是按照线程请求锁的时间早晚来进行划分的,也就是满足先到先得的原则;非公平锁:线程在运行时闯入的,并不是按照先到先得的原则。1.Java中两种锁的实现机制Reentrant reentrant = new Reentrant(true)代表公平锁Reentrant reentrant = new Reentrant(false)代表非公平锁如果构造函数不传入参数的话,那么默认就原创 2020-12-08 00:02:48 · 181 阅读 · 0 评论 -
Java高并发12-避免伪共享和锁机制
六 、源码:所在包:com.ruigege.OtherFoundationOfConcurrent2https://github.com/ruigege66/ConcurrentJavaCSDN:https://blog.csdn.net/weixin_44630050博客园:https://www.cnblogs.com/ruigege0000/欢迎关注微信公众号:傅里叶变换,个人账号,仅用于技术交流...原创 2020-12-03 00:15:29 · 265 阅读 · 0 评论 -
Java高并发11-伪共享,getUnsafe源码解析并利用反射获取Unsafe实例
一、复习二、getUnsafe源码解析private static final Unsafe unsafe = new Unsafe();public static Unsafe getUsafe(){ Class localClass = Reflection.getCallerClass(); if(!VM.isSystemDomainLoader(localClass.getClassLoader())){ throw new SecurityException("Unsafe");原创 2020-11-29 00:20:35 · 304 阅读 · 0 评论 -
Java高并发10-Unsafe类中其他方法以及测试
一、复习二、Unsafe类中的其他方法1.public native long getLongvolatile(Object obj,long offset)该方法用于获取对象obj地址偏移量为offset长度的对应volatile语义的值2.void putLongvolatile(Object obj,long offset,long value)该方法用于在对象obj地址偏移量为offset长度的类型为long的field值设置为value,支持volatile3.void put原创 2020-11-26 00:26:43 · 268 阅读 · 0 评论 -
Java高并发9-CAS操作与Unsafe类详解
一、复习计算机内存模型,synchronized和volatile关键字简介二、两者对比sychronized和volatile都解决了内存可见性问题不同点:(1)前者是独占锁,并且存在者上下文切换的开销以及线程重新调度的开销;后者是非阻塞算法,不会造成上下文切换的开销。(2)前者可以保证操作的原子性,但是后者不能保证操作的原子性。三、在什么情况下才会使用volatile写入变量是不依赖当前值的,如果是依赖当前值的话,由于获取-计算-写入,三者不是原子性操作,而volatile是保原创 2020-11-23 23:54:52 · 155 阅读 · 0 评论 -
Java高并发8-计算机内存模式以及volatile,sychronized工作原理
一、复习二、多CPU的好处减少线程上下文切换的开销三、 计算机的内存模型一块主内存,然后被多个线程所调用,每个线程又有自己的一级缓存,线程共享了二级缓存出现的问题:一级缓存是每个线程自己独有的,运行的时候,会先去一级缓存里面找,如果没有再去二级缓存,最后去内存,所以如果多个线程对一个共享变量操作的话,就会导致一级缓存里放置的数据是过期的,因此会产生问题。下面这张图是一个计算机架构模型每个核心都有自己的四、源码:所在包:com.ruigege.ThreadFoundation原创 2020-11-20 00:16:25 · 200 阅读 · 2 评论 -
Java高并发7-inheritableThreadLocal实现父子线程变量同步原理
一、二、threadLocal不具有继承性package com.ruigege.threadFoundation1;public class ThreadLocalExtend { public static ThreadLocal<String> threadLocal = new ThreadLocal<>(); public static void main(String[] args) { Thread thread = new Thread(new原创 2020-11-13 00:11:23 · 306 阅读 · 0 评论 -
Java高并发6-ThreadLocal内部各种方法实现原理
一、复习二、ThreadLocal实现原理1.首先看一下Thread类Thread类中有两个成员变量ThreadLocalMap threadLocalsThreadLocalMap inheritableThreadLocals2.然后再看一下TheadLocal类中的成员方法void set(T value)T get()ThreadLocalMap getMap(Thread t)void remove()T setInitialValue()void createMap原创 2020-11-10 00:29:07 · 161 阅读 · 0 评论 -
Java高并发4-解析volatile关键字
一、复习二、volatile解析1.计算机内部的内存模型我们知道计算机内部含有内存和CPU,那么在进行计算的时候,内存读写还是太慢了,因此在内存和CPU之间还是有一个缓存cache那么我们知道如果是一个共享变量的话,就会导致,内存中变量和缓存中的变量由于多线程同步不及时,也就是说,一个线程中的缓存还没来的急写入内存,此时有可能在内存中的变量被其他线程读取了。解决这个问题可以:1)通过在总线加LOCK#锁的方式;2)通过缓存一致性协议第一种方式效率低下,很难实现多线程;第二种方式有一个著名MSI原创 2020-11-04 00:18:06 · 172 阅读 · 0 评论 -
Java高并发3-中断线程以及isInterrupted与interrupted区别
一、复习上一节内容wait()方法、中断正在运行的线程会抛出java.lang.InterruptedException、当线程调用共享对象的wait()方法时,当前线程只会释放当前共享变量的锁,不会释放该线程所持有的其他共享变量的锁。wait(long timeout,int nanos)实现、wait(0)内部调用了wait()方法、notify()随机唤醒、notifyAll()全部唤醒、join方法、sleep方法、yield方法,以及sleep与yield方法的区别二、线程中断inter原创 2020-10-31 00:03:34 · 551 阅读 · 0 评论 -
Java高并发2-线程wait、sleep、yield、notify、join方法总结
一、复习上次连载两个基本单位线程进程的组成程序计数器定义以及执行native方法时是什么三种创建方式:extends Thread 重写run new 实例().start();implements Runnable 重写run new Thread(new 实例()).start();implements Callable 重写call(),有返回值 new FutureTask<返回值类型>(new 实例()) new Thread(new Fut原创 2020-10-29 00:06:51 · 304 阅读 · 0 评论 -
Java高并发1-创建线程的三种方式、虚假唤醒、native关键字
一、创建多线程的两种方式1.继承Thread类,重写run方法2.实现Runnable接口,重写run方法3.直接上代码package com.ruigege.threadFoundation1;public class MyThreadExtendsType extends Thread { @Override public void run() { System.out.println("这是一个继承Thread类的多线程表示方法"); }}package com.r原创 2020-10-25 23:53:29 · 206 阅读 · 0 评论