并发编程
文章平均质量分 91
并发编程的本质其实就是利用多线程技术,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分 。
CodingAnHour
明日复明日,明日何其多。我生待明日,万事成蹉跎。
展开
-
Java 独占锁ReentrantLock、读(悲观读)写锁ReentrantReadWriteLock、读(乐观读/悲观读)写锁StampedLock
锁必然要知道AbstractQueuedSynchronizer(AQS),AQS提供了一个框架,用于实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量、事件等)。独占,只有一个线程能执行,如ReentrantLock(悲观锁:除非线程1全部运行完后才会释放锁,否则其他线程无法拿到锁。可重入,公平与非公平特征 )Lock是juc中实现的锁接口,定义了锁的一些行为规范,他的设计目的是为了解决synchronized关键字在一些并发场景下不适用的问题,相对synchronized更灵活。....原创 2022-08-28 10:53:08 · 527 阅读 · 0 评论 -
并发编程(十一)什么是队列、常用的队列
1、什么是队列Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构,类似火车站排队买票。从图中可以看出,Queue接口与List、Set同一级别,都是继承了Collection接口。2、队列的常用方法2.1、Queue中方法简述方法操作说明是否抛异常add增加一个元素当队列长度限制,抛出 IllegalStateException,更推荐使用offeroffer添加一个元素当队列长度限制,达到上限,会抛出异常remove如果该队列包含一原创 2021-08-29 17:38:22 · 303 阅读 · 0 评论 -
并发编程(十)ThreadPoolExecutor源码分析、拒绝策略、队列、示例代码
1、为什么用ThreadPoolExecutor创建线程池虽然jdk中Executor框架提供了如newFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()等创建线程池的方法,但都有其局限性,不够灵活;另外由于前面几种方法内部也是通过ThreadPoolExecutor方式实现,使用ThreadPoolExecutor有助于大家明确线程池的运行规则,创建符合自己的业务场景需要的线程池,避免资源耗尽的风险。如果大家开发中使用《原创 2021-08-22 15:37:31 · 357 阅读 · 0 评论 -
并发编程(九)Executors线程池
1、什么是线程池线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源,因此Java中提供线程池对线程进行统一分配、 调优和监控2、为什么使用线程池在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理。如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题: 如果并发的请求数量非原创 2021-08-15 22:51:37 · 222 阅读 · 0 评论 -
并发编程(八)Thread源码分析,方法示例
1、Thread类是什么Java中Thread类用来实现线程编程什么是线程、什么是进程、为什么用到并发可以查看我的并发系列第一篇文章《并发编程(一)为什么用并发编程、JMM内存模型、volatile、内存屏障》2、线程的状态new java.lang.Thread().start()只有调用start()方法的时候,才会真正的在 JVM中去创建线程。线程从创建到最终的消亡,要经历若干个状态。一般来说,线程包括以下这几个状态:创建:new运行:runnable(运行中:running、就绪:r原创 2021-08-15 00:45:40 · 327 阅读 · 0 评论 -
并发编程(七)Unsafe魔法类CAS、内存屏障、线程调度
1. Unsafe是什么Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java语言拥有了 类似C语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。 在程序中过度、不正确使用Unsafe类会使得程序出错的概率变大,使得Java这种安全的语言变得不再“安全”,因此对Unsafe的使用一定要原创 2021-08-04 18:42:44 · 664 阅读 · 0 评论 -
并发编程(六)原子操作 java.util.concurrent.atomic
1 什么是原子操作“不能被进一步分割的最小粒子”,原子操作(atomic operation)即”不可被中断的一个或一系列操作”。在多处理器上实现原子操作就变得有点复杂。名称英语解释缓存行Cache line缓存的最小操作单位比较并交换 CAS(无锁的)Compare and SwapCAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下在旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换。CPU流水线CPU原创 2021-07-28 00:18:50 · 341 阅读 · 0 评论 -
并发编程(五)AbstractQueuedSynchronizer(AQS)-CountDownLatch、CyclicBarrier
CountDownLatchCountDownLatch是什么?CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行。CountDownLatch如何工作?CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。Co原创 2021-07-22 00:33:39 · 128 阅读 · 1 评论 -
并发编程(四)AbstractQueuedSynchronizer(AQS)-Semaphre(限流)源码分析跟踪
Semaphore 通常我们叫它信号量, 可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。共享锁默认创建非公平锁Semaphore保证的是资源的互斥而不是资源的同步,在同一时刻是无法保证同步的,但是却可以保证资源的互斥。使用场景经常用于限制获取某种资源的线程数量(限流)emaphore常用方法说明acquire()获取一个令牌,在获取到令牌、或者被其他线程调用中断之前线程一直处于阻塞状态。acquire(int permits)获取一个令原创 2021-07-21 22:22:58 · 153 阅读 · 0 评论 -
并发编程(三)AbstractQueuedSynchronizer(AQS)-ReentrantLock可重入、独占锁
并发之父 Doug LeaAbstractQueuedSynchronizerJava并发编程核心在于java.concurrent.util(juc)包juc当中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这个行为的抽象就是基于AbstractQueuedSynchronizer简称AQS,AQS定义了一套多线程访问共享资源的同步器框架,是一个依赖状态(state)的同步器(state:记录当前是否枷锁,枷锁的次数等等,引入可重入的功能 )等待队列原创 2021-07-16 01:40:06 · 174 阅读 · 2 评论 -
并发编程(二)synchronized锁
前言多线程编程中,有可能会出现多个线程同时访问同一个共享、可变资源的情况, 这个资源称之其为临界资源;这种资源可能是:对象、变量、文件等。共享:资源可以由多个线程同时访问可变:资源可以在其生命周期内被修改由于线程执行的过程是不可控的,所以需要采用同步机制来协同对对象可变状态的访问所有的并发模式在解决线程安全问题时,采用的方案都是序列化(有序)访问临界资源。即在同一时刻,只能有一个线程访问临界资源,也称作同步互斥访问。当多个线程执行一个方法时,该方法内部的局部变量并不是临界资源,因为这些局部变原创 2021-07-15 01:21:21 · 258 阅读 · 1 评论 -
并发编程(一)为什么用并发编程、JMM内存模型、volatile、内存屏障
一、前言现代计算机理论模型与工作方式现代计算机模型是基于-冯诺依曼计算机模型计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存 储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去。接下来,再取出第二条指令,在控制器的指挥下完成规定操作。依此进行下去。直至遇到停止指令。程序与数据一样存贮,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作是计算机最基本的工作模型。这一原理最初是由美籍匈牙利数学家冯.诺依曼于1945年提出来的,故称为冯.原创 2021-07-11 00:06:24 · 210 阅读 · 1 评论