
多线程
Jaymeng8848
攀爬每一个巨人,站在他们肩膀上看一看
展开
-
Synchronized关键字和锁升级,详细分析偏向锁和轻量级锁的升级
1、锁升级锁的4中状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态(级别从低到高)(1)偏向锁:为什么要引入偏向锁?因为经过HotSpot的作者大量的研究发现,大多数时候是不存在锁竞争的,常常是一个线程多次获得同一个锁,因此如果每次都要竞争锁会增大很多没有必要付出的代价,为了降低获取锁的代价,才引入的偏向锁。偏向锁的升级当线程1访问代码块并获取锁对象时,会在java对象头和栈帧中记录偏向的锁的threadID,因为偏向锁不会主动释放锁,因此以后线程1再次获取锁的时候,需要比较当前线程的th转载 2020-08-17 14:20:33 · 316 阅读 · 2 评论 -
乐观锁与悲观锁
何谓悲观锁与乐观锁乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。J转载 2020-08-17 14:09:15 · 121 阅读 · 0 评论 -
多线程下集合框架分析,基于JDK1.8
映射:HashTable:所有方法直接加上synchronized,因为synchronized是对象锁,当执行一个方法时,其他线程不能对其操作,导致效率极低。相较之下,ConcurrentHashMap,虽然也是使用synchronized,但是它没锁方法,锁的是代码块,也就是锁的是资源,也就是分段锁,这使得细粒度锁,可以读写同时进行其中核心代码为: final V putVal(K key, V value, boolean onlyIfAbsent) { if (key =原创 2020-07-25 12:01:41 · 159 阅读 · 0 评论 -
synchronized关键字
synchronized原理在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在。当我们调用某对象的synchronized方法时,就获取了该对象的同步锁。例如,synchronized(obj)就获取了“obj这个对象”的同步锁。不同线程对同步锁的访问是互斥的。也就是说,某时间点,对象的同步锁只能被一个线程获取到!通过同步锁,我们就能在多线程中,实现对“对象/方法”的互斥访问。 例如,现在有两个线程A和线程B,它们都会访问“对象obj的同步锁”。假设,在某一时刻,线程.原创 2020-07-24 15:51:08 · 84 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier、Semaphore底层分析
三个同步工具类需要学习底层AQS,各位学了再来会很容易理解CountDownLatch闭锁CountDownLatch中定义了加了final的静态内部类,其继承了AQS,用于实现同步锁机制。其中它重写了获取锁了释放锁。机制在于获取锁会根据state为0为标准判定是否获取成功,releas每次减少一个数值。运行逻辑在于设置一把有State数量层锁的大门,每个线程执行await时都会因为门被锁住而加入等待队列,然后设置前节点的waitstate为-1进行堵塞,每个线程执行到countdown时会解一把锁原创 2020-07-24 14:53:13 · 292 阅读 · 0 评论 -
捋一捋Condition
Condition讲解Condition的具体流程已经在上面贴出,大家可以先看了再来看一下我捋一捋生产者Condition运行流程。多线程执行先会获取锁lock(),这是其他的线程因为没有获取到锁会排一个同步队列,进入锁的线程继续执行,当满足条件会执行阻塞,抱着锁的线程会释放掉锁,并进入阻塞状态,进入condition构建的一条等待队列,waitState也会改为-2直到该节点被移到同步队列或者被中断。此时线程会进入其他方法并等到该等待队列唤醒才会将等待队列头节点释放加入同步队列。总的来说:相比syn原创 2020-07-24 13:36:51 · 110 阅读 · 0 评论 -
ReentrantLock源码逻辑解析
ReentrantLock底层是通过在类的内部定义抽象静态内部类,其中对其中一些上锁和解锁方法进行实现或重写。ReentrantLock真正的公平锁和非公平锁是定义了两个静态内部类实现了Sync进行操作,这也体现了满足设计模式的依赖倒置原则,对类进行抽象,面向抽象类和接口编程。接下来我会先分析一下Sync:重要方法: final boolean nonfairTryAcquire(int acquires) { final Thread current = Thread.curr原创 2020-07-24 11:21:02 · 131 阅读 · 0 评论 -
java中断
interrupt()说明在介绍终止线程的方式之前,有必要先对interrupt()进行了解。关于interrupt(),java的djk文档描述如下interrupt()的作用是中断本线程。本线程中断自己是被允许的;其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限。这有可能抛出SecurityException异常。如果本线程是处于阻塞状态:调用线程的wait(), wait(long)或wait(long, int)会让它进入等待(阻塞)状态,或者.原创 2020-07-23 22:53:03 · 249 阅读 · 1 评论 -
多线程之ThreadLocal
ThreadLocal的作用是提供线程内的局部变量,这种变量在多线程环境下访问时能够保证各个线程里变量的独立性下面会对其重点进行讲解:重写的hash算法// hash codeprivate final int threadLocalHashCode = nextHashCode(); // AtomicInteger类型,从0开始private static AtomicInteger nextHashCode = new AtomicInteger(); // hash cod原创 2020-07-23 19:15:20 · 231 阅读 · 0 评论 -
CLH锁
1.1 SMP(Symmetric Multi-Processor)对称多处理器结构,它是相对非对称多处理技术而言的、应用十分广泛的并行技术。在这种架构中,一台计算机由多个CPU组成,并共享内存和其他资源,所有的CPU都可以平等地访问内存、I/O和外部中断。虽然同时使用多个CPU,但是从管理的角度来看,它们的表现就像一台单机一样。操作系统将任务队列对称地分布于多个CPU之上,从而极大地提高了整个系统的数据处理能力。但是随着CPU数量的增加,每个CPU都要访问相同的内存资源,共享资源可能会成为系统瓶颈,导致原创 2020-07-23 18:25:20 · 219 阅读 · 0 评论 -
Java并发:同步工具类详解(CountDownLatch、CyclicBarrier、Semaphore)
概述同步工具类可以是任何一个对象,只要它根据其自身的状态来协调线程的控制流。阻塞队列可以作为同步工具类,其他类型的同步工具类还包括信号量(Semaphore)、栅栏(Barrier)以及闭锁(Latch)。本文就目前常用的3种同步工具类进行简单介绍。闭锁闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态。闭锁的作用相当于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能够通过,当到达结束状态时,这扇门会打来并允许所有的线程通过。当闭锁到达结束状态后,将不会再改变状态,因此这扇门将转载 2020-07-23 11:19:40 · 183 阅读 · 1 评论 -
Java多线程synchronized和lock锁的比较
多线程也快接近尾声,因为集合在多线程中的使用非常广泛,因此比较线程安全的Vector和JUC包下的集合类的差别也再所难免,主要也是为了更加了解多线程下保证线程安全的前提下用什么集合更加高性能,因此我会在最近最近两天深入探究一下JUC集合类,而集合底层实现又和synchronized和lock锁脱不了关系,因此想彻底搞清楚还需要好好研究...原创 2020-07-20 19:24:44 · 206 阅读 · 0 评论 -
Java多线程必须了解的CAS
CAS(Compare-And-Swap)是一种硬件对并发的支持,针对多处理器操作而设计的,处理器中的一种特殊指令,用于管理对共享数据的并发访问。CAS是一种无锁的非阻塞算法实现。是硬件对于并发操作的支持,保证了数据变量的原子性。Cas包含了3个操作数:内存值 V预估值 A更新值 B当且仅当 V == A 时, V = B; 否则,不会执行任何操作。简单的来说,CAS有3个操作数,要读写的内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则返回V原创 2020-07-18 10:13:27 · 117 阅读 · 0 评论 -
Java多线程系列源码讲解
站在巨人肩膀上学习多线程。这位博主的多线程总结的非常好,源码讲解也很清晰,在此记录,留作复习。JAVA多线程系列原创 2020-07-18 09:58:50 · 214 阅读 · 0 评论 -
java多线程入门
不谈callable和juc线程创建两种方式:1)指定类继承Thread类重写run方(写入线程需要执行的代码),实例化指定类,调用start方法,注意如果调用run方法只会相当于正常执行某个方法不能开启线程;2)指定类实现Runnable接口重写run方法,实例化指定类,将实例化的指定类当作参数传入Thread类的构造函数类;注意:多线程底层就是静态代理;Thread为代理类,Runna...原创 2020-04-16 22:15:47 · 145 阅读 · 0 评论 -
AQS--多线程锁的底层架构
这个作者对于AQS的讲解非常详细,在此记录收藏,以后留作复习浅谈Java的AQS原创 2020-07-18 09:55:26 · 208 阅读 · 0 评论