并发编程
文章平均质量分 88
No_Game_No_Life_
这个作者很懒,什么都没留下…
展开
-
Java并发编程实战——CAS与Unsafe
文章目录什么是CASUnsafe类AtomicInteger什么是CASCAS的全称为Compare-And-Swap,直译就是对比交换。是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值。其实现方式是基于硬件平台的汇编指令,就是说CAS是靠硬件实现的,JVM只是封装了汇编调用,那些AtomicInteger类便是使用了这些封装后的接口。CAS 方式为乐观锁,synchronized 为悲观锁。因此使用 CAS 解决并发问题通常情况下性能更优。但使用原创 2021-05-12 16:14:42 · 261 阅读 · 0 评论 -
深入分析Kqueue & Kevent
文章目录为什么用Kqueue?什么是Kqueue?Kqueue怎么运行?一个示例为什么用Kqueue?Wiki上的解释:kqueue 是一种可扩展的事件通知接口。2000 年 7 月发布的 FreeBSD 4.1 中首次引入了 kqueue,随后也被 NetBSD、OpenBSD、macOS 等操作系统支持。kqueue 在内核与用户空间之间充当输入输出事件的管线。因此在事件循环的迭代中,进行一次 kevent(2) 系统调用不仅可以接收未决事件,还可以修改事件过滤器。简单解释,Kqueue是原创 2020-12-20 17:31:04 · 1125 阅读 · 0 评论 -
Java并发编程实战——并发队列
文章目录非阻塞队列:ConcurrentLinkedQueue阻塞队列:BlockingQueueArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueueJava 提供的线程安全的 Queue 可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是 BlockingQueue,非阻塞队列的典型例子是 ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。 阻塞队列可以通过加锁来实现,非阻塞队列可以通过原创 2020-06-23 18:34:21 · 386 阅读 · 0 评论 -
Java并发编程实战——线程池ThreadPoolExecutor实现原理
文章目录为什么要使用线程池线程池的工作原理线程池的创建BlockingQueueexecute()方法如何合理配置线程池参数?之前在RabbitMQ池化方案中提到过线程池,本节我们加深理解。为什么要使用线程池在实际使用中,线程是很占用系统资源的,如果对线程管理不善很容易导致系统问题。因此,在大多数并发框架中都会使用线程池来管理线程,使用线程池管理线程主要有如下好处:降低资源消耗。通过复用...原创 2020-03-08 10:03:50 · 390 阅读 · 0 评论 -
Java并发编程实战——并发容器之ThreadLocal及其内存泄漏问题
文章目录ThreadLocal的简介ThreadLocal的实现原理ThreadLocalMap详解ThreadLocal内存泄漏问题ThreadLocal的使用场景ThreadLocal的简介之前写过用ThreadLocal做RabbitMQ的批量发送的文章,这里再深入了解一下。总的来说,ThreadLocal有什么作用呢?主要作用就是以“空间换时间”:通过各个线程自己的ThreadL...原创 2020-03-07 17:01:25 · 395 阅读 · 0 评论 -
Java并发编程实战——从并发容器CopyOnWriteArrayList看COW与读写锁的对比
文章目录CopyOnWriteArrayList的简介COW的设计思想CopyOnWriteArrayList的简介java学习者都清楚ArrayList并不是线程安全的,在读线程在读取ArrayList的时候如果有写线程在写数据的时候,基于fast-fail机制,会抛出ConcurrentModificationException异常,也就是说ArrayList并不是一个线程安全的容器,当然...原创 2020-03-07 11:37:26 · 584 阅读 · 0 评论 -
Java并发编程实战——并发容器之ConcurrentHashMap(JDK 1.8版本)
文章目录ConcurrentHashmap简介从关键属性及类上来看ConcurrentHashMap的结构put()方法管中窥豹CAS关键操作ConcurrentHashmap简介在使用HashMap时在多线程情况下扩容会出现CPU接近100%的情况,因为hashmap并不是线程安全的,通常我们可以使用在java体系中古老的hashtable类,该类基本上所有的方法都采用synchronize...原创 2020-03-07 11:22:18 · 428 阅读 · 0 评论 -
Java并发编程实战——详解Condition的await和signal等待通知机制
文章目录wait()、notify()为什么在Ojbect类下?Condition初探Condition实现原理分析wait()、notify()为什么在Ojbect类下?在jdk1.5以前,我们使用synchronized,而因为synchronized中的这把锁可以是任意对象的,所以任意对象都可以调用wait()和notify();所以wait和notify属于Object。关于wait...原创 2020-03-06 18:26:02 · 822 阅读 · 0 评论 -
Java并发编程实战——理解ReentrantLock和ReentrantReadWriteLock
文章目录ReentrantLock的介绍重入性的实现原理公平锁与公平锁ReentrantLock的介绍Reentrant就是重入的意思,ReentrantLock是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。这点和synchronized特别像,在java关键字synchronized隐式支持...原创 2020-03-06 15:12:48 · 232 阅读 · 0 评论 -
Java并发编程实战——深入理解AbstractQueuedSynchronizer(AQS)的同步队列
文章目录AQS的同步队列独占锁共享锁AQS的同步队列当共享资源被某个线程占有,其他请求该资源的线程将会阻塞,从而进入同步队列。就数据结构而言,队列的实现方式无外乎两者一是通过数组的形式,另外一种则是链表的形式。AQS中的同步队列则是通过链式方式进行实现。接下来,很显然我们至少会抱有这样的疑问:1. 节点的数据结构是什么样的?2. 是单向还是双向?3. 是带头结点的还是不带头节点的?我们依旧先是...原创 2020-03-05 16:14:49 · 255 阅读 · 0 评论 -
Java并发编程实战——AQS详解和ReentrantLock实现
文章目录总览:concurrent包的结构层次Lock简介Lock接口API初识AQSAQS的模板方法设计模式同步组件通过AQS实现的一个例子总览:concurrent包的结构层次下图为concurrent包的目录结构图。其中包含了两个子包:atomic以及lock,另外在concurrent下的阻塞队列以及executors,这些就是concurrent包中的精华,之后会一一进行学习。而...原创 2020-03-05 15:44:49 · 393 阅读 · 0 评论 -
Java并发编程实战——你真的了解final吗?
文章目录final的简介平时使用的finalfinal修饰变量final修饰方法final修饰类多线程中你真的了解final吗?final域基本数据类型的重排序规则写final域的重排序规则读final域的重排序规则final域引用类型的重排序规则为什么final引用不能从构造函数中“溢出”final的简介final关键字的好处:(1)final关键字提高了性能。JVM和Java应用都会缓存...原创 2020-03-05 11:57:22 · 465 阅读 · 0 评论 -
Java并发编程实战——彻底理解volatile
文章目录volatile实现原理volatile的happens-before关系volatile的内存语义volatile重排序与JMM内存屏障volatile的使用误区volatile的适用场景volatile实现原理在学习本文之前我们知道,被volatile修饰的变量能够保证每个线程能够获取该变量的最新值,从而避免出现数据脏读的现象。那么volatile是怎样实现的?比如一个很简单的J...原创 2020-03-04 15:13:02 · 466 阅读 · 0 评论 -
Java并发编程实战——彻底理解synchronized
文章目录synchronized实现原理对象锁(monitor)机制happens-before关系及内存抽象模型synchronized优化CASJava对象头synchronized实现原理在java代码中使用synchronized可是使用在代码块和方法中,根据Synchronized用的位置可以有这些使用场景:synchronized可以用在方法上也可以使用在代码块中,其中方法是实...原创 2020-03-03 16:54:57 · 413 阅读 · 0 评论 -
Java并发编程实战——java内存模型(JMM)和重排序数据依赖性规则
文章目录JMM的介绍内存模型抽象结构JMM抽象结构模型重排序的数据依赖性happens-before规则JMM的介绍当多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替运行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获取正确的结果,那这个对象是线程安全的。出现线程安全的问题一般是因为主内存和工作内存数据不一致性和重排序导致的,而...原创 2020-03-02 20:59:07 · 509 阅读 · 0 评论 -
Java并发编程实战——并发编程的优缺点
文章目录为什么要用到并发并发编程有哪些缺点频繁的上下文切换线程安全为什么要用到并发在多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。顶级计算机科学家Donald Ervin Knuth如此评价这种情况:在我看来,这种现象(并发)或多或少是由于硬件设计者无计可施了导致的,他们将摩尔定律的责任推给了软件开发者。另外,在特殊的...原创 2020-03-01 18:41:53 · 778 阅读 · 0 评论