![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java并发编程
文章平均质量分 97
Java并发编程
bubble小拾
梦想不止于编程,行动才是起点
展开
-
Java并发可见性、有序性、原子性与JMM内存模型解析
Java线程之间的通信由Java内存模型(Java Memory Model,简称JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在,它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。根据JMM的规定,线程对共享变量的所有操作都必须在自己的本地内存中进行,不能直接从主内存中读原创 2024-07-22 09:30:00 · 1073 阅读 · 0 评论 -
Java线程池ForkJoinPool原理分析
Fork/Join是一个并行计算的框架,主要就是用来支持分治任务模型的,这个计算框架里的 Fork 对应的是分治任务模型里的任务分解,Join 对应的是结果合并。它的核心思想是将一个大任务分成许多小任务,然后并行执行这些小任务,最终将它们的结果合并成一个大的结果。原创 2024-07-20 20:01:45 · 1977 阅读 · 0 评论 -
Java线程池ThreadPoolExecutor原理、源码分析
为什么要使用线程池?使用线程池相对于直接创建线程有以下优点:资源管理:线程池可以管理线程的创建和回收,避免频繁地创建和销毁线程,从而减少资源开销。线程复用:线程池中的线程可以被复用,避免了频繁地创建和销毁线程,提高了线程的利用率。控制并发数:线程池可以限制线程的数量,避免线程数过多导致系统资源耗尽,从而避免了系统崩溃或变得不稳定。队列机制:线程池通过使用任务队列来存储等待执行的任务,当线程池中的线程满了时,新的任务可以被放入队列中等待执行,避免了任务丢失。线程生命周期管理:线程池可以对线程的生原创 2024-07-18 23:53:34 · 1460 阅读 · 0 评论 -
Java阻塞队列BlockingQueue原理解析
阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实现都是基于BlockingQueue实现的。原创 2024-07-17 00:59:25 · 1320 阅读 · 0 评论 -
Java并发容器原理解析
基于CopyOnWriteArrayList实现,其唯一的不同是在add时调用的是CopyOnWriteArrayList的addIfAbsent方法,其遍历当前Object数组,如Object数组中已有了当前元素,则直接返回,如果没有则放入Object数组的尾部,并返回。所以,Java先提供了同步容器供用户使用。利用高并发往往是读多写少的特性,对读操作不加锁,对写操作,先复制一份新的集合,在新的集合上面修改,然后将新集合赋值给旧的引用,并通过volatile 保证其可见性,当然写操作的锁是必不可少的了。原创 2024-07-15 23:30:06 · 1033 阅读 · 0 评论 -
AQS之ReentrantLock源码分析
java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队 列、独占获取、共享获取等,而这些行为的抽象就是基于AbstractQueuedSynchronizer(简称 AQS)实现的,AQS是一个抽象同步框架,可以用来实现一个依赖状态的同步器。JDK中提供的大多数的同步器如Lock, Latch, Barrier等,都是基于AQS框架来实现的一般是通过一个内部类Sync继承 AQS将同步器所有调用都映射到Sync对应的方法阻塞等待队列共享/独占。原创 2024-07-13 16:06:44 · 1135 阅读 · 0 评论 -
JUC并发工具类的应用场景详解
解决多线程竞争资源的问题,例如多个线程同时对同一个数据库进行写操作,可以使用ReentrantLock保证每次只有一个线程能够写入。实现多线程任务的顺序执行,例如在一个线程执行完某个任务后,再让另一个线程执行任务。实现多线程等待/通知机制,例如在某个线程执行完某个任务后,通知其他线程继续执行任务。限流:Semaphore可以用于限制对共享资源的并发访问数量,以控制系统的流量。资源池:Semaphore可以用于实现资源池,以维护一组有限的共享资源。原创 2024-07-12 09:30:00 · 1017 阅读 · 0 评论 -
Java并发CAS详解与并发安全问题
什么是原子性?事务的一大特性就是原子性(事务具有ACID四大特性),一个事务包含多个操作,这些操作要么全部执行,要么全都不执行。并发里的原子性和原子操作是一样的内涵和概念,假定有两个操作A和B都包含多个步骤,如果从执行A的线程来看,当另一个线程执行B时,要么将B全部执行完,要么完全不执行B,执行B的线程看A的操作也是一样的,那么A和B对彼此来说是原子的。指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。原创 2024-07-10 23:58:15 · 999 阅读 · 0 评论 -
JVM内存泄露的ThreadLocal详解
JVM利用设置ThreadLocalMap的Key为弱引用,来避免内存泄露。JVM利用调用remove、get、set方法的时候,回收弱引用。当ThreadLocal存储很多Key为null的Entry的时候,而不再去调用remove、get、set方法,那么将导致内存泄漏。使用线程池+ ThreadLocal时要小心,因为这种情况下,线程是一直在不断的重复运行的,从而也就造成了value可能造成累积的情况。原创 2024-07-09 23:57:56 · 842 阅读 · 0 评论 -
Java并发/多线程CompleteableFuture详解
JDK1.8 才新加入的一个实现类 CompletableFuture,很好的解决了这些问题,CompletableFuture 实现了 Future, CompletionStage两个接口。实现了Future 接口,意味着可以像以前一样通过阻塞或者轮询的方式获得结果。原创 2024-07-08 23:57:03 · 1289 阅读 · 0 评论 -
深入理解Java并发、线程与等待通知机制
为什么用户线程又被称为协程呢?内核线程的切换开销是来自于保护和恢复现场的成本,那如果改为采用用户线程,这部分开销就能够省略掉吗?答案还是“不能”。但是,一旦把保护、恢复现场及调度的工作从操作系统交到程序员手上,则可以通过很多手段来缩减这些开销。由于最初多数的用户线程是被设计成协同式调度(Cooperative Scheduling)的,所以它有了一个别名——“协程”(Coroutine) 完整地做调用栈的保护、恢复工作,所以今天也被称为“有栈协程”(Stackfull Coroutine)。原创 2024-07-06 23:57:49 · 1162 阅读 · 0 评论