![](https://img-blog.csdnimg.cn/20190918140037908.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
并发编程
文章平均质量分 95
Java中的多线程编程
挥之以墨
一个半路出家的加瓦攻城狮,擅长搬砖
展开
-
【并发编程】(二十)线程池的实现原理简述
文章目录1.线程池概述1.1.什么是线程池1.2.线程池的作用2.线程池的使用2.1.线程池的创建方式2.2.创建线程池的参数3.线程池的实现原理1.线程池概述1.1.什么是线程池我们平时使用到线程的时候会去new Thread(),这种方式会创建一个线程,然后使用完成后被回收掉。不断的创建和销毁对服务器的资源也是一种浪费,针对这种资源浪费的情况,就出现了线程池,我们想要使用线程的时候,从线程池中去取出来,用完之后还回去,起到线程复用的效果。所以,什么是线程池呢?线程池就是一个用来存放线程对象的容原创 2021-06-10 18:40:36 · 442 阅读 · 0 评论 -
【并发编程】(十九)Callable的实现原理简述
文章目录1.Callable概述1.1.Callable与Runable的区别1.2.Callable的使用2.实现原理简述2.1.Callable是如何被线程调度的2.2.返回值的获取2.3.阻塞的实现2.4.阻塞线程的唤醒3.Callble执行流程图1.Callable概述1.1.Callable与Runable的区别Callable是一个用于定义多线程执行的代码逻辑的接口,里面定义了一个call()方法,类似于Runnable中的run()方法。子类实现了Callable接口后就可以重写call原创 2021-04-20 10:44:01 · 2574 阅读 · 4 评论 -
【并发编程】(十八)信号量Semaphore使用及实现原理
文章目录1.SemaPhore概述1.1.共享锁与独占锁1.2.Semaphore的作用1.3.Semaphore的使用2.Semaphore的实现原理2.1.Semaphore实例化2.2.Semaphore申请许可——acquire()2.3.Semaphore归还许可——release()1.SemaPhore概述在之前的文中中提到了并发编程使用到的锁,不管是synchronized还是ReentrantLock,其目的都是为了限制线程对资源的访问,从而起到保证线程安全的作用。信号量SemaPh原创 2021-04-06 16:57:58 · 564 阅读 · 0 评论 -
【并发编程】(十七)回环屏障CyclicBarrier使用及实现原理
1.CyclicBarrier的使用原创 2021-03-29 18:38:10 · 330 阅读 · 0 评论 -
【并发编程】(十六)栅栏CountDownLatch的使用及实现原理
文章目录1.CountDownLatch概述1.1.使用场景2.CountDownLatch的实现原理2.1.线程阻塞的实现1.CountDownLatch概述CountDownLatch可以看做是一个包含了阻塞功能的计数器,我们可以在创建它的时候定义一个执行次数,然后在代码中的某处调用阻塞方法来阻塞线程,线程每执行一次就将计数器中的执行次数减1,到计数器减到0时,就可以唤醒阻塞的线程继续执行。1.1.使用场景CountDownLatch可以阻塞一个线程,也可以阻塞多个线程。阻塞一个线程时,可以原创 2021-03-25 16:12:59 · 406 阅读 · 0 评论 -
【并发编程】(十五)Condition的使用及其阻塞唤醒原理
文章目录1.Condition的使用1.1.作用1.2.使用方式2.Condition的原理2.1.阻塞如何实现2.2.唤醒如何实现1.Condition的使用1.1.作用在使用独占锁的情况下,线程在临界区中运行,如果不做其它的处理,只有线程将临界区中的代码逻辑运行完成之后才会去解锁。但是我们有时候需要线程循环执行一些特定的代码,直到满足了一定的条件才会暂停下来,当这个条件不满足后又重新开始执行。比如线程池中的线程都是运行在一个死循环中,只要任务队列中获取了任务,就拿出来运行,任务队列中没有任务,原创 2021-03-20 16:51:06 · 559 阅读 · 0 评论 -
【并发编程】(十四)Java可重入互斥锁实现——ReentrantLock详解
文章目录1.ReentrantLock概述1.1.使用方式1.2.公平锁与非公平锁1.3.类结构1.3.1.Sync1.4.AQS中的Node2.非公平锁的实现2.1.加锁过程解析2.1.1.tryAcquire()2.2.2.addWaiter()2.2.3.acquireQueued()2.2.4.selfInterrupt()2.2.解锁过程解析2.2.1.tryRelease()2.2.2.unparkSuccessor()1.ReentrantLock概述ReentrantLock是Java原创 2021-03-16 09:47:40 · 747 阅读 · 1 评论 -
【并发编程】(十三)JUC并发工具包的基础——AQS概述
文章目录1.AQS概念1.1.什么是AQS1.2.AQS的实现原理2.使用AQS实现互斥锁2.1.简单互斥锁实现2.2.可重入的实现1.AQS概念本篇只会简单的提一下AQS的概念和使用方式,后续的笔记中会依据各个AQS实现类的源码来更深入的解析。1.1.什么是AQSAQS全称AbstractQueuedSynchronizer,顾名思义就是基于队列来实现的同步器框架,它可以实现线程之间的同步协作。我们经常会使用到的一些并发工具类都是基于它来实现的。如重入锁ReentrantLock、读写锁Reen原创 2021-03-06 12:03:08 · 421 阅读 · 0 评论 -
【并发编程】(十二)Java乐观锁的实现——CAS
文章目录1.CAS的概念2.为什么要有CAS3.CAS的缺点4.CAS的原理5.CAS在Java中的应用6.总结1.CAS的概念CAS的英文全称为CompareAndSwap,比较并替换的意思,通过这个名字可以大概猜到它的原理,在修改一个变量的时候需要用某种条件来做一个比较,如果比较成功则替换成新传入的值,如果比较失败就不执行更新操作。CAS的设计思想是认为不会出现线程竞争,直接获取共享变量的值做修改,不需要在操作共享变量之前做阻塞的操作,整个行为表现的非常乐观,所有也被称为乐观锁。2.为什么要有C原创 2021-03-04 18:10:56 · 871 阅读 · 2 评论 -
【并发编程】(十一)父子线程数据共享——InheritableThreadLocal原理
文章目录1.InheritableThreadLocal的作用1.1.父子线程的定义2.父线程向子线程传递数据2.1.InheritableThreadLocal的使用.2.2.父子线程数据共享的实现原理2.2.1.InheritableThreadLocal类2.2.2.如何实现数据共享2.2.3.childValue()方法3.线程池中的线程数据传递失效1.InheritableThreadLocal的作用在前面的博客《线程安全的代码及ThreadLocal的使用》中说到了ThreadLocal可以原创 2021-03-03 15:49:27 · 4264 阅读 · 1 评论 -
【并发编程】(十)线程局部变量——ThreadLocal原理详解
ThreadLocal的实现就是通过在线程对象Thread中维护一个来实现的,线程对象提供了线程隔离的基础,而作为存放数据的结构,提供了参数传递的基础。使用0x61c88647这样一个魔数来保证数组元素尽可能的分散,以此来减少Hash冲突。使用开放寻址法作为Hash冲突的解决方案。由于线程在实际项目中可复用的使用方式,需要使用对key做弱引用这样的方式来避免内存泄露。以作为标识的失效Entry对象的清理贯穿了始终。原创 2021-03-02 19:22:01 · 779 阅读 · 6 评论 -
【并发编程】(九)线程安全的代码及ThreadLocal的使用
文章目录1.线程安全的代码1.1.线程逃逸的例子2.ThreadLocal2.1.概念2.2.如何使用ThreadLocal2.2.1.实现线程隔离2.3.实现参数传递2.4.PageHelper是如何使用ThreadLocal的2.4.1.PageHelper的引入和使用2.4.2.ThreadLocal存放分页信息2.4.3.PageHelper注册拦截器2.4.4.通过ThreadLocal获取分页对象3.总结1.线程安全的代码在前面的博客中提到了Java并发编程中需要注意的线程安全问题,在不同的原创 2021-02-27 17:18:34 · 562 阅读 · 0 评论 -
【并发编程】(八)跨线程可见性保证——happens-before规则
文章目录1.对happens-before的理解1.1.JMM对happens-before的设计1.2.as-if-serial语义1.3.happens-before语义2.happens-before的六种规则2.1.程序顺序规则2.2.监视器锁规则2.3.volatile规则2.4.传递性规则2.5.start()规则2.6.join()规则1.对happens-before的理解happens-before是JMM定义的提供跨线程的内存可见性保证的规则。在前面的文章中提到过内存的可见性问题主原创 2021-02-23 11:16:58 · 285 阅读 · 4 评论 -
【并发编程】(七)volatile原理——解决可见性、有序性问题
volatile的作用是并发环境下,在一定的作用范围内解决共享变量的可见性和有序性问题,相对于synchronized和显示的加锁,volatile在性能上根据优势,可以尽可能的以更细的粒度来保证线程安全。通过JMM提供的lock指令,来使用CPU底层的提供的总线锁或缓存锁来保证共享资源的实时同步和更新。总线锁在加锁后会阻塞CPU访问内存,所以大多数CPU是通过缓存一致性协议对缓存行状态的控制来达到多个线程之间的共享变量值同步。JMM提供了四种内存屏障,插入到各个指令之间,让。原创 2021-01-25 14:50:44 · 4190 阅读 · 10 评论 -
【并发编程】(六)线程活跃性问题(死锁、饥饿、活锁)
1.什么是死锁1.1.活跃性问题2.产生死锁的原因2.1.顺序死锁2.1.1.显式加锁顺序导致的死锁2.2.2.对象互相调用导致的死锁2.2.资源死锁3.死锁的诊断4.其它问题4.1.饥饿4.2.活锁原创 2021-01-09 18:10:29 · 695 阅读 · 0 评论 -
【并发编程】(五)Synchronized锁优化及锁升级
文章目录1.为什么要做锁优化2.JDK后续做了哪些优化2.1.自适应自旋2.2.锁消除2.3.锁粗化2.4.轻量级锁2.4.1.Mark Word2.4.2.线程获取轻量级锁的过程2.4.3.锁膨胀2.4.4.解锁过程2.4.5.获取轻量级锁流程图2.5.偏向锁2.5.1.偏向锁的优势2.5.2.偏向锁的缺点2.5.3.获取偏向锁的过程2.5.4.获取偏向锁流程图3.锁的升级过程1.为什么要做锁优化重量级锁在加锁后,如果出现线程竞争锁的情况,没有抢占到锁的线程会进入阻塞队列中挂起,等待持有锁的线程释放锁原创 2021-01-07 17:44:02 · 416 阅读 · 0 评论 -
【并发编程】(四)synchronized的使用及其实现原理
1.1.Java内存模型在增加了同步措施的情况下,线程A在操作共享变量时会从主内存加载到自己独占的工作内存中,并对自己工作内存中的变量进行写操作,再把修改过后的变量副本同步到主内存中。然后线程B再从主内存中加载已修改过的共享变量,重复线程A做的操作,这也的结果会是正确的。但是没有同步措施的情况下,线程A、B同时做了读取、计算、同步回主内存的操作,就相当于其中一个线程对未修改过的共享变量进行了计算和写操作,在某些情况下就会出现结果和预期结果不一致的情况。例如:比如累加一个数值时,就会出现数值少加了一次原创 2021-01-04 16:26:35 · 410 阅读 · 0 评论 -
【并发编程】(三)多线程带来的线程安全问题
线程安全问题指的是多个线程访问共享资源时,在缺少同步措施的情况下对共享资源进行了写操作而导致的执行结果与预期值不符的情况。但如果多个线程只是共同读取共享资源,不进行写操作是不会有线程安全问题的。共享资源:就是多个线程都可以共同访问的资源,例如:在JVM中,处于堆、方法区中的对象。① 造成线程安全问题的原因是程序代码不具备三个特性——原子性、可见性、有序性。② 使用volatile修饰变量,能解决变量的可见性和有序性问题,Java中的原子性操作往往加上volatile修饰被操作的字段就能保证线程安全。原创 2020-12-25 17:26:19 · 833 阅读 · 0 评论 -
【并发编程】(二)如何优雅的中断一个线程
文章目录1.中断线程的几种方式1.1.stop()方法1.2.标识字段2.优雅的中断线程——interrupt2.1.interrupt相关的方法2.2.两个interrupt中断线程的例子2.2.1.用做标识退出while循环2.2.2.用于打断等待阻塞2.3.isInterrupted和interrupted使用的区别2.3.1.使用interrupted静态方法可能遇到的坑2.3.2.interrupted()线程的复位的验证3.总结1.中断线程的几种方式线程正常或使用标识字段终止线程内的循环,原创 2020-12-23 12:05:30 · 730 阅读 · 0 评论 -
【并发编程】(一)并发编程基础和线程的生命周期
在并发编程中,线程的数量往往是大于CPU的核心数的,也就是说会出现多个核心共用一个CPU核心的情况,在这种情况下,为了让用户感觉多个线程是在同时执行的,CPU资源的分配采用了时间片分配的策略。并行存在的前提一定是多核CPU,只有多个核心的存在才能达到多个事件同时运行的目的,而并发通过单个CPU时间片的切换,给不同的线程分配调度的时间就可以实现了。run()方法就是一个普通的Java函数,直接调用它就是外部的线程调用了thread对象中的一个方法而已,是同步执行的,达不到多线程并发执行的目的。原创 2020-12-22 14:32:57 · 305 阅读 · 0 评论