![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 91
多线程
心灵彼岸-诗和远方
对一个程序员来说数据结构与算法是内功,各种技术就是招式,只有并驾齐驱方可到达巅峰!
展开
-
Java并发之AQS详解
一、概述 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。 以下是本文的目录大纲: 概述 框架 源码详解 简单应用 若有不正之处,请谅解和批评指正,不胜感激。转载 2021-01-28 11:21:51 · 207 阅读 · 1 评论 -
乐观锁CAS
前言 在Java并发中,我们最初接触的应该就是synchronized关键字了,但是synchronized属于重量级锁,很多时候会引起性能问题,volatile也是个不错的选择,但是volatile不能保证原子性,只能在某些场合下使用。像synchronized这种独占锁属于悲观锁,它是在假设一定会发生冲突的,那么加锁恰好有用,除此之外,还有乐观锁,乐观锁的含义就是假设没有发生冲突,那么我正好可以进行某项操作,如果要是发生冲突呢,那我就重试直到成功,乐观锁最常见的就是CA...原创 2021-01-28 10:18:41 · 150 阅读 · 1 评论 -
线程上下文切换
由于现在大多计算机都是多核CPU,多线程往往会比单线程更快,更能够提高并发,但提高并发并不意味着启动更多的线程来执行。更多的线程意味着线程创建销毁开销加大、上下文非常频繁,你的程序反而不能支持更高的TPS。可以看另一篇《Java从线程安全到synchronized和Lock探索》时间片多任务系统往往需要同时执行多道作业。作业数往往大于机器的CPU数,然而一颗CPU同时只能执行一项任务,如何让用户感觉这些任务正在同时进行呢?操作系统的设计者巧妙地利用了时间片轮转的方式时间片是CPU分配给各个任..转载 2021-01-28 08:51:52 · 734 阅读 · 0 评论 -
并发举措九之ThreadLocal
前言 ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。因为ThreadLocal是线程私有的,所以也是线程安全的。一、实现机制 ThreadLocal 一种解决多线程环境下成员变量的问题的方案,但是与线程同步无关。其思路是为每一个线程创建一个单独的变量副本,从而每个...原创 2021-01-27 17:37:08 · 298 阅读 · 6 评论 -
并发举措八之并发集合
前言: 本文并不会对Java并发集合详细介绍,本文的目的在与大家需要意识到并发集合也是解决并发的措施之一 一、ConcurrentHashMap CAS + Synchronized 来保证并发更新的安全,底层采用数组+链表/红黑树的存储结构 concurrencyLevel:并行级别、并发数、Segment 数,怎么翻译不重要,理解它。默认是16,也就是说ConcurrentHashMap 有16 个Segm...原创 2021-01-27 17:13:54 · 192 阅读 · 3 评论 -
并发举措七之阻塞队列
前言: 阻塞队列的典型使用场景就是生产者/消费者模式。本文会介绍Java7种阻塞队列。一、阻塞对列的实现机制阻塞队列,关键字是阻塞,先理解阻塞的含义,在阻塞队列中,线程阻塞有这样的两种情况:1.当队列中没有数据的情况下,消费者端的所有线程都会被自动阻塞(挂起),直到有数据放入队列。2.当队列中填满数据的情况下,生产者端的所有线程都会被自动阻塞(挂起),直到队列中有空的位置,线程被自动唤醒。二、阻塞对列常用api阻塞队列提供了四种处理...原创 2021-01-27 16:29:24 · 247 阅读 · 2 评论 -
并发举措六之线程池
前言 请大家优先阅读美团技术团队写的Java线程池实现原理及其在美团业务中的实践。https://blog.csdn.net/heijunwei/article/details/112985523,本文仅仅是对这篇文章没有涉及的知识点而且比较重要的补充,狗尾续貂。 executort优先于线程,jdk1.5中已经增加了java.util.concurrent。这个字包中包含了一个ExecutorFramework它是一个很灵活的基于接口的任务执行工具。...原创 2021-01-27 12:15:48 · 130 阅读 · 0 评论 -
并发举措五之Atomic
前言 我们在并发举措之二之volatile中讲过,volatile关键字修饰的变量可以使不用线程之间可见,且volatile 禁止了指令重排。但是volatile关键字修饰的变量在运行中还可能出现线程不安全的情况,根本原因在与对变量的操作不能保证其原子性,java.util.concurrent包提供了一组原子操作的封装类,它们位于java.util.concurrent.atomic包。常见的有AtomicInteger、AtomicBoolean、AtomicInteg...原创 2021-01-26 17:54:16 · 294 阅读 · 1 评论 -
并发举措四之ForkJoin
前言 fork/join作为一个并发框架在jdk7的时候就加入到了我们的java并发包java.util.concurrent中,并且在java 8 的lambda并行流中充当着底层框架的角色。它可以执行一种特殊的任务:把一个大任务拆成多个小任务并行执行。使用ForkJoin将相同的计算任务通过多线程的进行执行。从而能提高数据的计算速度。在google的中的大数据处理框架mapreduce就通过类似ForkJoin的思想。通过多线程提高大数据的处理。一、 ForkJo...原创 2021-01-26 12:11:58 · 276 阅读 · 1 评论 -
并发举措三之ReentrantLock
前言 从Java 5开始,引入了一个高级的处理并发的java.util.concurrent包,它提供了大量更高级的并发功能,能大大简化多线程程序的编写。我们知道Java语言直接提供了synchronized关键字用于加锁,但这种锁一是很重(jdk1.6之前),二是获取时必须一直等待,没有额外的尝试机制。java.util.concurrent.locks包提供的ReentrantLock用于替代synchronized加锁。ReentantLock继承接口Lock并实现...原创 2021-01-26 10:24:49 · 303 阅读 · 1 评论 -
并发举措之二之volatile
前言 Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。volatile 变量具备两种特性,volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。volatile关键字的作用(变量可见性、禁止重排序) 变量可见性: 其一是保证该变量对所有线程可见,这里的可见性指的是当一个线程修改了变量的值,那么新的值对于其他线程是可以立即获取的。 禁止...原创 2021-01-25 18:18:06 · 103 阅读 · 0 评论 -
并发举措之一Synchronized
前言:阅读本文之前,请先阅读并发的根因,选读并发锁机制与深入探索java线程两篇文章。synchronized它可以把任意一个非NULL的对象当作锁。他属于独占式的悲观锁,同时属于可重入锁,可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,解决并发的原子性与可见性的问题。目录一、Synchronized实现机制: 1.1、Synchronized自身实现机制 1.1.1、核心组件: 1.1.2、实现流程 1.2、Synchronize...原创 2021-01-25 11:48:46 · 129 阅读 · 0 评论 -
Java锁机制
前言Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体分类目录:1. 乐观锁 VS 悲观锁乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念转载 2021-01-25 09:39:15 · 76 阅读 · 1 评论 -
并发的根因
并发问题变幻莫测,一谈到并发就显得非常高深,一般的程序员对于并发问题也是头疼不已,但是随着网络互联越来越普遍,大规模用户访问网站程序也越来越频繁,并发问题又无法避免。在我们解决并发问题前首先要理解产生并发问题的根源是什么,所有并发处理的工具只是针对这些根源问题的其中一种解决方案,如果只去了解解决方案而不理解问题的根源是什么,那么我们就很难正确的定位问题并对症下药。所以要写好并发程序我们首先就要深入理解并发问题产生根源是什么?起因:如何最大化的利用CPUCPU运算速度和IO速度的不平衡...转载 2021-01-23 17:35:26 · 187 阅读 · 0 评论 -
Java线程池实现原理及其在美团业务中的实践
随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。本文开篇简述线程池概念和用途,接着结合线程池的源码,帮助读者领略线程池的设计思路,最后回归实践,通过案例讲述使用线程池遇到的问题,并给出了一种动态化线程池解决方案。一、写在前面1.1 线程池是什...转载 2021-01-22 15:06:03 · 104 阅读 · 0 评论 -
对象及变量的并发问题
一、synchronized对象监视器为Object时的使用 1.1synchronized方法 1.当A线程调用anyObject对象加入synchronized关键字的x方法,A线程获得了X方法的锁,即获得了对象锁,所以其他线程等A线程执行完毕才可以调用X方法,但其他线程可以随意调用其他的非synchronized同步方法; 2..当A线程调用anyObject对象...原创 2020-02-26 21:39:57 · 303 阅读 · 0 评论 -
线程间通信
一、使用wait/notify实现线程间通信 作用:减少cpu资源浪费等待用时实现多个线程间的通信 作用范围:用于同步块与同步方法中 属于Object类 wait() 使线程停止运行,由running进入Blocked状态 立即释放对象锁 wait()状态遇到interrupt会抛异常 wait(lon...原创 2020-02-26 21:42:24 · 96 阅读 · 0 评论 -
JAVA多线程基础
一、进程与多线程的概念 进程:操作系统管理的基本运行单位,可以理解为运行在内存中的exe文件 线程:进程中运行的独立子任务 多线程的目的:提升cpu的利用率二、线程的启动 继承thead类,实现run方法 1.使用多线程技术时,代码的运行结果与执行顺序或调用顺序无关的 2.调用start方法是通知线程规划器,此线程已准备就绪; 3....原创 2020-02-26 21:18:24 · 135 阅读 · 0 评论 -
深入探索JAVA多线程
并发处理的广泛应用,即为人类压榨计算机运算能力的最有利武器。 因计算机的运算速度远远高于IO,通信及数据库访问等操作,所以通过并发充分利用计算机的运行能力。 一、计算机的内存模型 主内存与工作内存 Java内存模型主要目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量(Va...原创 2020-02-26 22:35:00 · 122 阅读 · 1 评论