并发编程
文章平均质量分 77
并发编程
融极
未来像盛夏的大雨,来不及撑伞就已经倾盆而下。
展开
-
AQS源码分析二(Condition等)
AQS源码分析原创 2022-06-13 22:20:43 · 78 阅读 · 0 评论 -
AQS源码分析一(公平独占锁)
AQS源码分析原创 2022-06-06 23:10:34 · 115 阅读 · 0 评论 -
Java AQS核心数据结构
概述在并发编程中,锁是一种常用的保证线程安全的方法。Java中常用的锁主要有两类,一种是Synchronized修饰的锁,被称为Java内置锁或监视器锁。另一种就是J2SE 1.5版本之后的java.util.concurrent包中的各类同步器,包括ReentrantLock(可重入锁),ReentrantReadWriteLock(可重入读写锁),Semaphore(信号量),CountDownLatch等。这些同步器都是基于AbstractQueueSynchronizer这个简单的框架来构建的,而原创 2022-05-15 17:02:05 · 274 阅读 · 0 评论 -
Java工作内存与主内存同步时机
概述java工作内存和主内存模型在多线程中,多个线程访问主存中的临界资源(共享变量)时,需要首先从主存中拷贝一份共享变量的值到自己的工作内存中,然后在线程中每次访问该变量时都是访问的线程工作内存(高速缓存)中的共享的变量副本,而不是每次都去主存读取共享变量的值(因为CPU的读写速率和主存读写速率相差很大,如果CPU每次都访问主存的话那么效率会非常低)。java线程变量加载的大致流程是,将主内存的变量加载到工作内存进行处理,处理完毕后写会主内存。工作内存和主内存数据交换时机先看下如下代码,主线程运原创 2022-05-10 17:30:05 · 2075 阅读 · 1 评论 -
深入理解Java的内存模型与并发机制底层原理
1.概述为什么要了解Java的内存模型?Java的内存模型是程序运行的基础知识,对于我们理解Java并发编程有一定的帮助,甚至一些并发知识的底层实现原理也是基于Java的内存模型来实现的。计算机系统硬件与执行效率的一致性“让计算机并发执行若干个并发任务”与“更充分的利用计算机的处理器效能”之间的因果关系相对复杂,这种复杂性的来源是绝大多数的运算任务不可能只是靠处理器的“计算”就能完成的。处理器至少要与内存进行交互,如读取运算数据、存储运算结果等,这个IO操作就很难消除的(无法仅仅靠寄存器来完成所有的运原创 2022-05-10 11:39:09 · 312 阅读 · 0 评论 -
并发编程总结
概述这里对并发编程涉及到的知识点做一个总结。知识点知识点概览Java并发编程概览(一)线程知识Java并发编程-进程与线程(二)Java并发编程-线程(三)并发编程的艺术并发编程的挑战Java并发机制的底层实现原理Java内存模型Java并发编程基础ThreadLocal详解Java中的锁Java并发容器和框架Java中的13个原子操作类Java中的并发工具类Java中的线程池Executor框架线程池之ForkJoinPool线程同步java多线程协作Java原创 2022-04-06 17:19:44 · 394 阅读 · 0 评论 -
Executor框架
概述在Java中,使用线程来异步执行任务。Java线程的创建与销毁需要一定的开销,如果我们为每一个任务创建一个新线程来执行,这些线程的创建与销毁将消耗大量的计算资源。同时,为每一个任务创建一个新线程来执行,这种策略可能会使处于高负荷状态的应用最终崩溃。Java的线程既是工作单元,也是执行机制。从JDK 5开始,把工作单元与执行机制分离开来。工作单元包括Runnable和Callable,而执行机制由Executor框架提供。Executor框架简介Executor框架的两级调度模型在HotSpot原创 2022-04-06 16:47:47 · 154 阅读 · 0 评论 -
Java中的线程池
概述Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用线程池,必须对其实现原理了如指掌。线程原创 2022-04-06 15:57:43 · 194 阅读 · 0 评论 -
Java中的并发工具类
概述在JDK的并发包里提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类提供了在线程间交换数据的一种方法。本章会配合一些应用场景来介绍如何使用这些工具类。等待多线程完成的CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。类别场景可以把CountDownLatch使用比作一个导游带队的场景,只有所有队员都到齐了,导游才能宣布去下一个景点。原创 2022-04-05 22:32:39 · 1783 阅读 · 0 评论 -
Java中的13个原子操作类
概述当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2。因为A和B线程在更新变量i的时候拿到的i都是1,这就是线程不安全的更新操作,通常我们会使用synchronized来解决这个问题,synchronized会保证多线程不会同时更新变量i。而Java从JDK1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中的原子操作类提供了原创 2022-04-05 20:17:31 · 281 阅读 · 0 评论 -
Java并发容器和框架
概述Java程序员进行并发编程时,相比于其他语言的程序员而言要倍感幸福,因为并发编程大师Doug Lea不遗余力地位Java开发者提供了非常多的并发容器和框架。本章让我们一起来见识一下大师操刀编写的并发容器和框架,并通过每节的原理分析一起来学习如何设计出精妙的并发程序。ConcurrentHashMap的实现原理与使用ConcurrentHashMap是线程安全且高效的HashMap。下面我们一起研究一下该容器时如何在保证线程安全的同时又能保证高效的操作。为什么要使用ConcurrentHashMa原创 2022-04-05 11:36:49 · 602 阅读 · 0 评论 -
Java中的锁
概述Lock接口锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁)。在Lock接口出现之前,Java程序时靠synchronized关键字实现锁功能的,而Java SE5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显示地获取和释放锁。虽然它缺少了(通过synchronized块或者方法所提供的的)隐式获取释放锁的便原创 2022-04-03 17:27:28 · 518 阅读 · 0 评论 -
Java并发编程基础
概述java从诞生开始就明智地选择了内置对多线程的支持,这使得Java语言相比同一时期的其他语言具有明显的优势。线程作为操作系统调度的最小单元,多个线程能够同时执行,这将显著提升程序的性能,在多核环境中表现得更加明显。但是,过多的创建线程对线程的不当管理也容易造成问题。本章将着重介绍Java并发编程的基础知识,从启动一个线程到线程间不同的通信方式。线程简介现在操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作系统就会创建一个Java进程。现代操作系统调度的最小单元是线程,也原创 2022-03-27 21:56:43 · 1338 阅读 · 0 评论 -
Java内存模型
概述Java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰Java程序员,本章将接口Java内存模型 神秘的面纱。Java内存模型的基础并发编程模型的两个关键问题在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式的,整个通信过程对程序员完全透明。如果编写多线程程序的Java程序员不理解隐式进行的线程之间通信的工作机制,很可能会遇到各种奇怪的内存可见性问题。Java内存模型的抽象结构在Java中,所有实例域、原创 2022-03-14 22:21:52 · 829 阅读 · 0 评论 -
Java并发机制的底层实现原理
概述volatile的定义与实现原理公共的变量,多个线程都可以访问,每个线程访问时都可以拿到它的最新值,所以它是异变的。可以把volatile修饰的变量比如成小孩子完的叠叠圈,多个小孩子可以同时看到叠叠圈的变化,每次去放圈或者取圈都是在最新变化的基础上且是排他的。Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁更加方便。如果一原创 2022-03-13 22:16:02 · 518 阅读 · 0 评论 -
并发编程的挑战
概述并发编程的目的是为了让程序运行的更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行的更快,会面临非常多的挑战,比如上下文切换的问题、死锁的问题,以及受限于硬件和软件的资源限制问题。上下文切换即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所有CPU通过不停的切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。CP原创 2022-03-08 22:24:13 · 117 阅读 · 0 评论 -
CompletableFuture:组合式异步编程-Java 8
概述我们看到的下一代网络应用都采用“混聚”(mash-up)的方式:它会使用来自多个来源的内容,将这些内容聚合在一起,方便用户生活。比如,你可能希望为你的法国客户提供指定主题的热点报道。为实现这一功能,你需要向谷歌或者Twitter的API请求所有语言中针对该主体最热门的评论,可能还需要依据你的内部算法对它们的相关性进行排序。之后,你可能还需要使用谷歌的翻译服务把它们翻译成法语,甚至利用谷歌地图服务定位出评论者的位置信息,最终将所有这些信息聚集起来,呈现在你的网站上。当然,如果某些外部网络服务发生响应原创 2022-03-01 22:20:54 · 528 阅读 · 0 评论 -
Java锁的种类
概述锁大概有以下名词:自旋锁、自旋锁的其他种类、阻塞锁、可重入锁、读写锁、互斥锁、悲观锁、乐观锁、公平锁、偏向锁、对象锁、线程锁、锁粗化、锁消除、轻量级锁、重量级锁、信号量、独享锁、共享锁、分段锁。我们所说锁的分类其实应该按照锁的特性和设计来划分。其实从并发的角度来讲,按照线程安全的三种策略看,主要内容都集中在互斥同步里,我们所讨论的锁也集中在这个部分,这个部分的锁都是悲观锁;第二个部分是非阻塞同步,这个部分也就一种通过CAS进行原子类操作,这个部分可以看成乐观锁,其实也就是不加锁;第三个部分是无同原创 2021-12-17 16:34:43 · 5894 阅读 · 0 评论 -
Java线程池&Executor框架梳理
概述参考一个demo让你彻底理解线程池工作流程原创 2021-12-01 20:42:25 · 277 阅读 · 0 评论 -
CountDownLatch详解
概述CountDownLatch概念CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,用来作为线程间的通信而不是互斥作用。CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现,计数器初始值就是线程的数量。当每个被计数的线程完成任务后,计数器值减一,当计数器的值为0时,表示所有线程都已经完成了任务,然后在CountDownLatch上等待的线程就可以恢复执行。CountDownLatch的用法...原创 2021-11-04 11:44:35 · 23198 阅读 · 1 评论 -
Guava之Stopwatch计时器-Guava
概述Stopwatch用来计算经过的时间(精确到纳秒)。这个类比调用System.nanoTime()优势在于:性能表现形式更丰富原创 2021-10-26 16:23:29 · 967 阅读 · 0 评论 -
ThreadLocal详解
共享变量引发的问题java中对全局变量的操作是通过JMM(java内存模型)内存模型实现的,全局变量保存在主存中,但是变量的计算则是在线程的工作内存中。线程计算的过程如下:从主存中获取变量副本,保存到线程工作内存。对变量操作。把工程内存的变量写入主存。从这个过程中可以看出,如果多个线程同时对一个变量操作,但是1,2,3如果不是一次性完成(原子性的),那么就会导致不同线程把数据的结果写乱,导致结果不是我们期待的。具体示例可以参考:Java并发编程-共享模型之管程(Monitor)(四)原创 2021-09-20 09:30:56 · 1332 阅读 · 0 评论 -
java并发编程-park/unpark
基本使用它们是LockSupport类中的方法// 暂停当前线程LockSupport.park();// 恢复某个线程的运行LockSupport.unpark(Thread thread);unpark即可以在park之后调用也可以在park之前调用,unpark的调用跟顺序无关。使用示例@Slf4jpublic class ParkTest { public static void main(String[] args) throws InterruptedExcept原创 2021-08-24 22:27:24 · 194 阅读 · 0 评论 -
Java并发编程-异步模式之生产者/消费者
概述与前面的保护性暂停中的GuardObject不同,不需要产生结果和消费结果的线程一一对应。消费队列可以用来平衡生产和消费的线程资源。生产者仅负责产生结果数据,不关心数据改如何处理,而消费者专心处理结果数据。消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据。JDK中各种阻塞队列,采用的就是这种模式。...原创 2021-08-12 21:18:11 · 149 阅读 · 0 评论 -
Java并发编程-同步模式之保护性暂停
定义即Guarded Suspension(保护性暂停),用在一个线程等待另一个线程的执行结果。有一个结果需要从一个线程传递到另一个线程,让他们关联同一个GuardedObject。如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)。JDK中,join的实现、Future的实现,采用的就是此模式。因为要等待另一方的结果,因此归类到同步模式。...原创 2021-08-11 21:08:34 · 163 阅读 · 0 评论 -
Java并发编程-共享模型之管程(Monitor/Synchronized)(四)
共享问题synchronized线程安全分析Monitorwait/notify线程状态转换活跃性Lock原创 2021-07-18 11:09:58 · 311 阅读 · 0 评论 -
Java并发编程-线程(三)
方法一,直接使用Threadpublic class TestThread { public static void main(String[] args) { Thread thread = new Thread("t1") { @Override public void run() { System.out.println("test thread " + Thread.currentThread原创 2021-07-12 23:09:05 · 206 阅读 · 0 评论 -
Java并发编程-进程与线程(二)
概述进程和线程的概念。并行和并发的概念。线程基本应用。进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用例加载指令、管理内存、管理IO的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(比如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(比如网易云音乐、360安全卫士等)。线程一个原创 2021-07-10 17:42:13 · 101 阅读 · 0 评论 -
Java并发编程概览(一)
什么是JUCJUC就是java.util.concurrent工具包的简称。并发涵盖了哪些内容进程。线程。并发。并行。java并发工具、并发问题以及解决方案。为什么学并发编程应用程序服务器(tomcat)、RPC框架、消息中间件等都使用了并发编程。涉及到高性能相关的业务编程,消息处理,日志处理等。提高工作能力。并发内容概述预备知识线程安全问题,需要接触过java web开发、jdbc开发、web服务器、分布式框架等。基于jdk8,对函数式编程、lambda有一定了解原创 2021-07-10 17:21:00 · 124 阅读 · 0 评论 -
java多线程协作
管程法概念管程可以看做一个软件模块,它是将共享的变量和对这些变量的操作封装起来,形成一个具有一定接口功能的模块,线程可以调用管程来实现线程级别的并发控制。线程只能互斥的使用管程,即当一个线程使用管程时,另一个进程必须等待。当一个线程使用完管程后,它必须释放管程并唤醒等待管程的某个线程。在管程入口处的等待队列称为等待队列,由于线程会执行唤醒操作,因此可能有多个等待使用管程的队列,这些队列有优先级之分,高优先级先得到执行。管程的特征模块化:管程时一个基本的软件模块,可以被单独编译抽象数据类型原创 2020-10-19 22:36:17 · 213 阅读 · 0 评论 -
线程池之ForkJoinPool
概述ForkJoinPool分支/合并框架,就是在必要的情况下,将一个大任务拆分(fork)成若干个小任务(拆到不能再拆为止),在将一个个的小任务运算的结果进行Join汇总。原创 2021-05-06 23:07:07 · 7774 阅读 · 1 评论