Java 并发编程
文章平均质量分 91
Java 并发编程核心知识
Boilermaker1992
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[Java 并发编程] 进程与线程
进程是程序的一次执行实例。程序的一次启动执行就是在创建一个进程。也就是当我运行一个磁盘上的可执行文件,操作系统就会将这个程序加载到内存,以进程的维度去运行,为其分配资源,控制其并发执行。每个进程都有独立的地址空间,操作系统保证其运行时的相互隔离,因此一切进程都能安全地并发执行。进程是操作系统资源分配的基本单位。进程主要包括:代码段,也就是程序代码;数据段,也就是程序的操作数据;原创 2025-01-16 11:10:08 · 732 阅读 · 0 评论 -
[Java 并发编程] 在 Java 中创建线程
事实上,Java 有且仅有一种方式可以真正创建出线程,那就是通过调用 Thread 类中的start()方法。因为只有这个方法会去真正调用 JVM 本地方法,进而进行操作系统创建线程的系统调用,并让 Java 线程与操作系统线程产生映射关系,最后将实现了 Runnable 接口的任务传递给线程。只要线程获得了 CPU 时间片,就进入 run() 方法执行具体的代码逻辑。 所以,仅仅有 start 方法我们就可以创建一个线程了,如下面的代码所示。原创 2025-11-24 21:19:31 · 1108 阅读 · 0 评论 -
[Java 并发编程] Thread 类
在 Java 中,我们不能随意地中断一个线程,因为我们不清楚这个线程的运行状态,它可能持有锁,如果强行中断它可能会导致锁不能被释放的问题。或者可能正在操作数据库,强行中断可能出现数据不一致的情况。因此,Interrupt方法实际上是为目标线程设置一个中断状态,而不是真的中断其运行,目标线程的具体退出时机由其自己决定。 如果目标线程处于运行状态,则不会受任何影响,只是状态被标记为中断,目标线程需调用来监听这个状态,从而响应中断信号。 如果目标线程处于阻塞状态(wait()join()原创 2025-12-12 08:52:09 · 349 阅读 · 0 评论 -
[Java 并发编程] 线程池
我们之所以引入线程,是因为进程的创建和销毁过于重量,而线程可以共享更多内存资源,因此成为显著提高效率的手段。但线程也是 OS 分配的,也涉及用户态和内核态的切换,也是一种很有限的资源,其创建和销毁的开销虽然比进程小,但也不可忽视。 如果想在线程的基础上,进一步提高并发编程的效率,目前有两种主流解决方案: 协程:这是纯用户态的轻量级线程,由程序自己控制调度,不涉及操作系统内核切换。在 Java 中被称为 VirtualThread。 线程池:使用池化技术提高资源利用率。原创 2025-12-12 11:54:36 · 987 阅读 · 0 评论 -
[Java 并发编程] 重量级锁原理(从对象头深入 Mutex 源码)
Java 对象在堆内存中的存储布局可以分为三部分:对象头、实例数据、对齐填充。其中,对象头包含了对象在运行时所需的一些元数据,它主要由两部分组成: Mark Word:记录对象自身的运行时数据。 类型指针:它指向元空间中该对象对应的类元数据(Klass 结构体),JVM 通过这个指针来判断该对象是哪个类的实例。 在这里我们需要重点关注的是 Mark Word,理解它是理解 synchronized、锁状态升级等概念的关键。原创 2025-11-28 13:14:22 · 898 阅读 · 0 评论 -
【Java 并发编程】应用案例
在实际开发中,我们会遇到很多 “经典场景”,针对这些 “经典场景”,前人已经提出了一些很好的解决方案,称为 “设计模式”。掌握一些重要的 “设计模式” 来进行编码,是程序员必备的技能。原创 2025-01-21 15:14:19 · 891 阅读 · 0 评论 -
【Java】多线程(2)线程初识与线程安全
在多核 CPU 的时代,并发编程是刚需,而对于多进程编程模型来说,一个明显的缺点是进程过于重量,效率不高。前置知识中提到过,进程是资源分配的基本单位,进程的创建、销毁、调度等操作都需要一定的时间来申请资源。如果需要频繁创建、销毁进程,这个时候申请资源的开销就不能忽视了。比如,频繁的分配内存操作就是一个耗时操作:操作系统的内部有相应的数据结构来管理空闲的内存块,当申请内存的时候,系统就会从数据结构中找到大小合适的空闲空间,返回给对应的进程,整体来说,因为操作系统管理的空间比较多,相比之下这个操作非常耗时。原创 2025-01-16 16:49:55 · 1168 阅读 · 0 评论 -
【Java】多线程(4)相关细节
CAS(Compare and swap)意为比较并交换。虽然从代码层面来看,通过比大小决定是否赋值这样的操作不可能成为原子操作,可能被穿插执行,但在硬件层面上,它可以通过一条 CPU 的指令来完成。由此,这个通过比较决定是否交换的操作成为了一个原子操作,简称为 CAS。由于其具有原子性,我们可以利用它来编写一些线程安全的代码,来代替一些比较重量的操作。在 Java 中,通过 Unsafe 类实现了 CAS。原创 2025-01-21 15:44:09 · 872 阅读 · 0 评论
分享