
并发编程
文章平均质量分 91
赵彦祖
学而不思则罔,思而不学则殆。
展开
-
深入理解ForkJoin
因为对于计算任务较重的任务,CPU的每个核心基本都是满负荷的,设置更多的线程不仅不会提升性能,反而由于线程之间对CPU资源的争抢造成不必要的上下文切换导致性能下降。在需要执行新的任务时,同样在工作队列的尾端取任务。工作线程处理自己的工作队列的同时,还可以窃取其他工作线程的任务,为了降低冲突的发生,窃取的位置在工作队列的首端。一般情况下,工作线程是从它自己对应的工作队列(WorkQueue数组)的头部获取任务执行,但当它的工作队列为空时会从其他繁忙的工作线程的工作队列的尾部窃取任务来执行。原创 2023-08-21 23:23:47 · 1046 阅读 · 0 评论 -
深入理解阻塞队列BlockingQueue
ArrayBlockingQueue是一个基于静态数组实现的有界阻塞队列,遵循“先进先出”的原则。静态数组表示队列长度是固定的,没有扩容机制。另外在静态数组中没有元素的位置存储的是null,这一点从上面的源码也可以看出来。ArrayBlockingQueue使用了一个ReentrantLock锁,这意味着其存取操作加的都是同一把锁,即其存取操作不能同时进行,存储操作排斥。原创 2023-08-21 23:23:05 · 303 阅读 · 0 评论 -
深入理解CyclicBarrier
CyclicBarrier翻译过来是回环栅栏,它可以实现让一组线程等待至某个状态之后再全部同步执行,这个状态叫屏障点。当所有等待线程都被释放后,CyclicBarrier可以重置再次使用。CyclicBarrier的功能是由ReentrantLock和Condition共同实现的,因此在其内部拥有ReentrantLock类型的lock属性和Condition类型的trip属性。此外,还有用于保存该屏障拦截的线程数parties属性和当前剩余等待的线程数count属性。原创 2023-08-21 23:22:30 · 232 阅读 · 0 评论 -
深入理解CountDownLatch
CountDownLatch是一个同步协助类,通常用于一个或多个线程等待,直到其他线程完成某项工作。CountDownLatch使用一个计数值进行初始化,调用它提供的await()方法的线程会被阻塞直到该计数值减为0。减计数值的方法是countDown(),该方法可以在同一个线程中多次调用,也可以在多个线程中被调用,当计数值减为0时所有调用await()方法的线程被唤醒。原创 2023-08-21 21:36:24 · 148 阅读 · 0 评论 -
深入理解Semaphore
Semaphore(信号量)是操作系统中PV操作的原语在java中的实现,它也是基于AQS实现的。其中PV操作是操作系统中一种实现进程互斥与同步的有效方法。PV操作与信号量(S)的处理有关,P表示通过,V表示释放。用PV操作来管理共享资源时,首先要确保PV操作自身执行的正确性。ReentrantLock是AQS的独占锁实现,Semaphore是AQS的共享锁实现。Semaphore通过设置资源数量可以实现限流的功能,即控制同时只能有n个线程获取信号量。原创 2023-08-21 21:35:51 · 285 阅读 · 0 评论 -
深入理解AQS和ReentrantLock
在AQS的设计中,使用一个volatile修饰的state变量来表示资源的状态,但对于AQS的不同实现,这个state表示的意义也是不同的。例如对于ReentrantLock来说state是某个线程重入锁的次数,对于Semaphore来说state是共享资源的数量等等。AQS具有MESA模型所定义的同步队列和条件队列。同步等待队列:主要用于维护获取锁失败时入队的线程;原创 2023-08-21 21:35:20 · 123 阅读 · 0 评论 -
深入理解synchronized
synchronized是Java提供的一种原子性内置锁,Java中的每个对象都可以把它当作一个同步锁来使用,这些Java内置的使用者看不到的锁被称为内置锁,也叫监视器锁。互斥是保证临界区的竟态条件发生,同一时刻只能有一个线程执行临界区代码;同步是由于线程执行的先后顺序不同,某个线程需要等待其他线程运行到某个点。synchronized可以使用在多个地方,使用位置决定了锁对象,具体如下表:位置分类具体分类伪代码被锁的对象方法实例方法调用该方法的类的实例对象静态方法类对象代码块。原创 2023-08-21 21:32:44 · 137 阅读 · 0 评论 -
深入理解CAS和Atomic工具类
需要注意的是,它只会保证修改对象引用的线程安全。需要注意的是,如果先调用两次unpark()方法再调用两次park()方法,线程仍会阻塞,因此两次unpark()方法与一次unpark()方法效果一致,只是将_counter的值设为1,但park()方法调用一次都需要消耗掉一个凭证。ABA问题指的是当有多个线程对一个原子类进行操作的时候,某个线程在短时间内将原子类的值A修改为B,随后又将其修改为A,这个过程对于其他线程是感知不到的,其他线程在用A值与修改后的A值比较还是相等的,最终可以修改成功。原创 2023-08-21 21:32:10 · 252 阅读 · 0 评论 -
深入理解Java线程
需要注意的是,优先级并不是绝对的,因为Java线程是通过映射到系统的原生线程来实现的,因此线程调度最终还是取决于操作系统,优先级只是或多或少的可以影响到一些。join()方法可以理解成是线程合并,当在一个线程中调用另一个线程的join方法时,当前线程阻塞等待被调用join()方法的线程执行完毕才能继续执行,所以join()方法的好处是能保证线程的执行顺序,但调用join()方法的线程和当前线程已经失去了并发的意义,虽然存在多个线程,但本质还是串行执行的。线程互斥可以看成是一种特殊的线程同步。原创 2023-08-21 21:31:35 · 135 阅读 · 0 评论 -
深入理解JMM和并发三大特性
其缺点是窥探是不可扩展的。而基于目录的机制延迟较高,但使用更少的带宽,因为消息是点对点的,而不是广播的,因此许多较大的系统(>64位处理器)使用这种类型的缓存一致性。缓存锁定是指内存区域如果被缓存在处理器的缓存行中,并且在Lock操作期间被锁定,那么当它执行锁操作协会内存时,处理器不会在总线上发出LOCK#信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会组织同时修改由两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行的数据时,会使该缓存行无效。原创 2023-08-21 21:31:03 · 296 阅读 · 0 评论 -
并发编程之线程池
线程池线程池的实现原理线程池的使用合理地配置线程池原创 2020-06-24 02:27:12 · 150 阅读 · 0 评论 -
并发编程之AQS
本篇文章介绍AbstractQueueSynchronized,内容皆总结摘抄自《Java并发编程的艺术》和《Java并发编程实战》,仅作笔记。AQS介绍队列同步器AbstractQueuedSynchronizer是用来构建锁或其他同步组件的基础框架,使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态,在同步器中提供了getState()、setState()和compareA原创 2020-05-26 02:27:18 · 152 阅读 · 0 评论 -
并发编程之对象的共享
1原创 2020-05-23 18:49:44 · 251 阅读 · 0 评论 -
并发编程之性能与可伸缩性
1原创 2020-06-27 02:15:24 · 404 阅读 · 0 评论 -
并发编程之避免活跃性危险
1原创 2020-06-26 05:35:47 · 171 阅读 · 0 评论 -
并发编程之Callable、Future和FutureTask
1原创 2020-06-21 18:00:27 · 430 阅读 · 0 评论 -
并发编程之阻塞队列和生产者-消费者模式
1原创 2020-06-17 01:14:46 · 263 阅读 · 0 评论 -
并发编程之Executor框架
1原创 2020-06-27 16:52:24 · 324 阅读 · 0 评论 -
并发编程之原子操作类
1原创 2020-05-29 01:12:35 · 168 阅读 · 0 评论 -
并发编程之同步工具类
1原创 2020-06-20 23:22:47 · 183 阅读 · 0 评论 -
并发编程之并发容器
1原创 2020-06-14 19:02:14 · 180 阅读 · 0 评论 -
并发编程之Lock及其实现类
1原创 2020-05-28 03:38:49 · 916 阅读 · 0 评论 -
并发编程之并发编程基础
1原创 2020-05-24 23:38:16 · 222 阅读 · 0 评论 -
并发编程之Java内存模型
1原创 2020-05-21 19:20:08 · 142 阅读 · 0 评论 -
并发编程之线程安全性以及内置锁
1原创 2020-05-20 21:28:38 · 183 阅读 · 0 评论 -
并发编程之线程简介
1原创 2020-05-11 21:57:42 · 164 阅读 · 0 评论