并发编程
文章平均质量分 87
缘来如此09
度,恒
展开
-
并发编程--Semaphore信号量
一、简介:Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以 保证合理的使用公共资源。实现其实就是一个共享锁,是基于AQS实现的,通过state变量来实现共享。通过调用acquire方法,对state值减去一,当调用release的时候,对state值加一。当state变量小于0的时候,在AQS队列中阻塞等待二、使用场景:当我们需要对某个任务限制资源使用时,比如我们这个系统 有多个接口,其中一个接口不重要其他接口特别重...原创 2021-09-27 11:22:59 · 229 阅读 · 0 评论 -
并发编程--CyclicBarrier(线程屏障)详解
一、简介CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一 组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会 开门,所有被屏障拦截的线程才会继续运行。下图演示了这一过程。二、与countdownlatch的区别它的主要作用其实和CountDownLanch差不多,都是让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障会被打开,所有被屏障阻...原创 2021-09-26 11:33:10 · 862 阅读 · 0 评论 -
并发编程--并发工具类
一、CountDownLatch1.概述CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行。CountDownLatch 定义了一个计数器,和一个阻塞队列, 当计数器的值递减为0之前,阻塞队列里面的线程处于挂起状态,当计数器递减到0时会唤醒阻塞队列所有线程,这里的计数器是一个标志,可以表示一个任务一个线程,也可以表示一个倒计时器,CountDownLatch可以解决那些一个或者多个线程在执行之前必须依赖于某些必要的前提业务先执行的场景。2.常用方法Coun原创 2021-09-25 12:20:42 · 261 阅读 · 0 评论 -
并发编程--Fork/Join框架
一、简介Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干 个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 我们再通过Fork和Join这两个单词来理解一下Fork/Join框架。Fork就是把一个大任务切分 为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任务的结 果。比如计算1+2+…+10000,可以分割成10个子任务,每个子任务分别对1000个数进行求和, 最终汇...原创 2021-09-23 15:21:41 · 212 阅读 · 0 评论 -
并发编程--堵塞队列
一、简介阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞 的插入和移除方法。 1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不 满。 2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是 从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。 二、BlockingQ原创 2021-09-22 18:45:43 · 469 阅读 · 0 评论 -
并发编程--ConcurrentLinkedQueue详解
一、简介: 工作中有时候需要使用线程安全的队列。如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁 (入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现。非阻塞的实现方式则可以使用循环CAS的方式来实现。而ConcurrentLinkedQueue 就是juc包中自带的经典非堵塞方式实现的工具类二、结构ConcurrentLinkedQueue由head节点和tail节点组成,每个...原创 2021-09-20 15:15:55 · 9402 阅读 · 0 评论 -
并发编程--ConcurrentHashMap的底层实现
一、简介Map 这样的Key Value在软件开发中是非常经典的结构,常用于在内存中存放数据。我们常使用HashMap来实现这种数据结构,但是HashMap是线程不安全的,而使用线程安全的HashTable效率又非常低下,基于以上两个原因,便有了ConcurrentHashMap,它是线程安全且高效的HashMap。二、HashMap 与HashTable简介1.HashMap 在多线程环境下存在的问题1.8之前HashMap 底层是基于数组 + 链表,1.8之后HashMap 数...原创 2021-09-17 15:32:41 · 427 阅读 · 0 评论 -
并发编程--Java中的锁(二)ReentrantReadWriteLock 源码分析
一、性质:(1)公平性选择:支持非公平性(默认)和公平的锁获取方式,吞吐量还是非公平优于公平;(2)重入性:支持重入,读锁获取后能再次获取,写锁获取之后能够再次获取写锁,同时也能够获取读锁;(3)锁降级:遵循获取写锁,获取读锁再释放写锁的次序,写锁能够降级成为读锁二、继承关系:3....原创 2021-09-08 08:54:53 · 108 阅读 · 0 评论 -
并发编程--Java中的锁(二)ReentrantLock源码分析
读本文之前需要先了解:1.jdk中锁基础应用https://blog.csdn.net/zhang09090606/article/details/119923448?spm=1001.2014.3001.55012.AQShttps://blog.csdn.net/zhang09090606/article/details/120009379一、ReentrantLock底层实现原创 2021-09-06 14:18:46 · 84 阅读 · 0 评论 -
并发编程--AQS源码分析
一、简介AQS全称AbstractQueuedSynchronizer,它是为实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量,事件等)提供的一个框架。AQS继承了AbstractOwnableSynchronizer类,这个类为创建锁和相关同步器提供了基础。AQS是Concurrent包的核心,lock就是在AQS的基础上实现的,阻塞队列,线程池,信号量等都离不开AQS的支持。二、Node节点AQS主要是维护了一个队列同步器,而队列中主要是存储Node节...原创 2021-09-01 10:15:28 · 170 阅读 · 0 评论 -
并发编程--Java中的锁(一)应用
一、Lock接口1.简介 与synchronized类似都是用来控制多个线程访问共享资源的方式,但是它缺少了(通过synchronized块或者方法所提供的)隐式获取释放锁的便捷性,却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性。 所以在一些需要灵活操作锁的场景时例如先获得锁A,然后再获取锁B,当锁B获得后,释放锁A同时获取锁C,当锁C获得后,再释放B同时获取锁D场景下使用Lock接口就比较合适...原创 2021-08-30 09:30:41 · 174 阅读 · 0 评论 -
并发编程--线程池
一、为什么要使用线程池?在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建并销毁线程的过程势必会消耗内存。而在Java中,内存资源是及其宝贵的,所以,我们就提出了线程池的概念二、线程池参数1、corePoolSize(核心线程数)当向线程池提交一个任务时,若线程池已创建的线程数小于corePoolSize,即便此时存在空闲线程,也会通过创建一个新线程来执行该任务,直到已创建的线程数大于或等于corePoolSize,corePoolSize中的线程即使处于原创 2021-08-25 09:22:20 · 517 阅读 · 0 评论 -
并发编程--线程详解
一、线程简介现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作系统就会创建一个Java进程。现代操作系统调度的最小单元是线程,也叫轻量级进程,在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量二、线程优先级 操作系统基本采用时分的形式调度运行的线程,操作系统会分出一个个时间片,线程会分配到若干时间片,当线程的时间片用完了就会发生线程调度,并等待着下次分配。线程分配到的时间...原创 2021-08-23 09:30:01 · 2219 阅读 · 0 评论 -
并发编程--volatile详解
一、volatile的定义Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言 提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。 二、Java内存模型(JMM)现代计算机的内存模型其实早期计算机中cpu和内存的速度是差不多的,但在现代计算机中,cpu的指令速度远超内存的存取速度,由于计算机的存储设备与处理器的运算.原创 2021-08-17 09:00:53 · 267 阅读 · 0 评论 -
并发编程--深入理解synchronized锁升级
一、synchronized应用场景1.修饰实例的方法public synchronzied void test() {}2.修饰静态方法public static synchronized void test() {}3.修饰代码块public void test() { // 对当前对象this加锁 synchronized(this) { ... } // 对class对象加锁 synchronized(Test.class) { ... }原创 2021-07-20 17:34:57 · 668 阅读 · 0 评论