![](https://img-blog.csdnimg.cn/6587ea781f49471a8ea7aeaa3b212f5b.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java 并发编程
文章平均质量分 95
此专栏为Java 并发编程系列
奥特迦
越努力,越幸运。
展开
-
【Java 并发编程】CopyOnWriterArrayList 详解
CopyOnWriteArrayList 体现了写时复制的思想,增删改操作都是在复制的新数组中进行的;CopyOnWriteArrayList 的取值方法是弱一致性的,无法确保实时取到最新的数据;CopyOnWriteArrayList 的增删改方法通过可重入锁确保线程安全;CopyOnWriteArrayList 线程安全体现在多线程增删改不会抛出异常,并不能确保数据的强一致性;原创 2023-09-22 10:42:47 · 388 阅读 · 4 评论 -
【Java 并发编程】读写锁 ReentrantReadWriteLock & StampLock 详解
读写锁 ReadWriteLock,顾名思义一把锁分为读与写两部分,读锁允许多个线程同时获得,因为读操作本身是线程安全的。而写锁是互斥锁,不允许多个线程同时获得写锁。并且读与写操作也是互斥的。读写锁适合多读少写的业务场景。针对读多写少场景,Java 的并发包提供了读写锁 ReentrantReadWriteLock,整体架构和实现都与 ReentrantLock 类似,不同之处在于 ReentrantReadWriteLock 分为读锁和写锁,读锁是共享锁,可多个读线程共享一把锁;原创 2023-07-22 17:08:15 · 412 阅读 · 0 评论 -
【Java 并发编程】Java 线程池实现原理及其在业务中的实践
线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。而本文描述线程池是JDK中提供的ThreadPoolExecutor类。降低资源消耗。转载 2023-07-13 15:37:21 · 293 阅读 · 1 评论 -
【Java 并发编程】深入理解 AQS - ReentrantLock 源码分析
AQS,全名 AbstractQueuedSynchronizer,是一个抽象同步队列,它的内部通过维护一个状态 volatile int state(共享资源的状态),一个 FIFO 线程等待队列来实现同步功能。Java 并发包很多工具类底层都是基于 AQS 来实现的,比如:Lock 工具 ReentrantLock、栅栏 CountDownLatch、信号量 Semaphore 等。原创 2023-05-30 23:15:01 · 689 阅读 · 1 评论 -
【Java】不可不说的Java“锁”事
Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8和Netty 3.10.6)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。本文Java中常用的锁以及常见的锁的概念进行了基本介绍,并从源码以及实际应用的角度进行了对比分析。转载 2023-04-28 09:58:39 · 123 阅读 · 0 评论 -
【Java 并发编程】一文读懂线程、协程、守护线程
为什么用户线程又被称为协程呢?我们知道,内核线程的切换开销是来自于保护和恢复现场的成本, 那如果改为采用用户线程, 这部分开销就能够省略掉吗?答案还是“不能”。但是,一旦把保护、恢复现场及调度的工作从操作系统交到程序员手上,则可以通过很多手段来缩减这些开销。原创 2023-04-02 15:11:56 · 2014 阅读 · 13 评论 -
【Java 并发编程】一文详解 Java volatile关键字
Java 内存模型(Java Memory Model,JMM),是一种抽象的模型,并不真实存在。所有的共享变量都存储在主内存(Main Memory)中,这里所说的变量指的是实例变量和类变量,不包含局部变量,因为局部变量是线程私有的,因此不存在竞争问题。每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的拷贝副本。线程对变量的所有操作(读/写)都必须在本地内存中进行,而不能直接读写主内存。原创 2023-05-05 15:14:35 · 432 阅读 · 3 评论 -
【Java 并发编程】Java 线程的生命周期
本文来一起学习 Java线程的生命周期new - 初始、runnable - 运行、blocked - 阻塞、waiting - 等待、timed_waiting - 超时等待、terminated - 终止。原创 2023-04-01 23:11:16 · 725 阅读 · 12 评论 -
【Java 并发编程】一文了解线程间有哪些通信方式?
关键字 synchronized 可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性。可以通过 Java 内置的等待/通知机制 - wait()、notify/notifyAll() 实现一个线程修改一个对象的值,而另一个线程感知到了变化,然后进行相应的操作。通知一个在对象上等待的线程,使其从 wait() 方法返回,而返回的前提是该线程获取到了对象的锁,没有获得锁的线程重新进入 WAITING 状态。原创 2023-04-14 16:42:43 · 693 阅读 · 3 评论 -
【Java 并发编程】CAS 原理解析
悲观锁的原理是每次实现数据库的增删改的时候都进⾏阻塞,防⽌数据发⽣脏读。乐观锁的原理是在数据库更新的时候,⽤⼀个 version 字段来记录版本号,然后通过⽐较是不是⾃⼰要修改的版本号再进⾏修改。这其中就引出了⼀种⽐较交换的思路来实现数据的⼀致性,事实上,CAS 也是基于这样的原理。原创 2023-05-18 14:14:49 · 1113 阅读 · 20 评论 -
【Java 并发编程】Java 线程本地变量 ThreadLocal 详解
先一起看一下 ThreadLocal 类的官方解释:用大白话翻译过来,大体的意思是:ThreadLoal 提供给了线程局部变量。同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。这里有几点需要注意:因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread 使用。这是也是 ThreadLocal 命名的由来。既然每个 Thread 有自己的实例副本,且其它 Thread 不可访问,那就不存在多线程间共享的问题。原创 2023-05-09 15:20:01 · 3940 阅读 · 4 评论 -
【Java 并发编程】一文详解 Java 中有几种创建线程的方式
一个 Java 程序从main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上,因为执行 main() 方法的是一个名称为main 的线程。不同的 JDK 版本,启动的线程数会有差异,但这依然证明了 Java 程序天生就是多线程的。原创 2023-03-26 15:33:00 · 987 阅读 · 22 评论 -
【Java 并发编程】一文详解 Java 内置锁 synchronized
关键字 synchronized 可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,同时可以保证一个线程的变化可见(可见性),即可以代替 volatile。关键字加到 static 静态方法和代码块上都是是给 Class 类上锁。关键字加到实例方法上是给对象实例上锁。/*** 提供一个私有的静态属性,对于 volatile 修饰的字段,可以防止指令重排/*** 提供一个私有构造函数:避免类在外部被实例化。原创 2023-05-05 21:45:25 · 1324 阅读 · 3 评论 -
【Java 并发编程】我们为什么要学并发编程?
可以看到,在互联网大厂 Java 开发岗的并发编程属于标配。当然,在中小型企业并发编程的能力也是加分项,在工作中善用并发编程不仅能提高公司项目的使用体验,也能提升程序员在公司的技术话语权。原创 2023-03-25 10:55:14 · 798 阅读 · 0 评论