0、开篇词:你为什么需要学习并发编程你好,我是王宝令,资深架构师,目前从事电商架构的设计工作。从毕业到现在,我前前后后写了15年的程序,刚毕业的时候从事证券业务的开发,开发语言是C/C++,之后从事ERP产品的研发,开发语言主要是C#和Java,最近几年主要是从事Java开发...2026-01-19Java并发编程实战
1、可见性、原子性和有序性问题:并发编程Bug的源头如果你细心观察的话,你会发现,不管是哪一门编程语言,并发类的知识都是在高级篇里。换句话说,这块知识点其实对于程序员来说,是比较进阶的知识。我自己这么多年学习过来,也确实觉得并发是比较难的,因为它会涉及到很多的底层知识,比如若你对操作系统相关的知识一无...2026-01-19Java并发编程实战
2、Java内存模型:看Java如何解决可见性和有序性问题上一期我们讲到在并发场景中,因可见性、原子性、有序性导致的问题常常会违背我们的直觉,从而成为并发编程的Bug之源。这三者在编程领域属于共性问题,所有的编程语言都会遇到,Java在诞生之初就支持多线程,自然也有针对这三者的技术方案,而且在编程语言领域处...2026-01-19Java并发编程实战
3、互斥锁(上):解决原子性问题在[第一篇文章]中我们提到,一个或者多个操作在CPU执行的过程中不被中断的特性,称为“原子性”。理解这个特性有助于你分析并发编程Bug出现的原因,例如利用它可以分析出long型变量在32位机器上读写可能出现的诡异Bug,明明已经把变量成功写入内存,重...2026-01-19Java并发编程实战
4、互斥锁(下):如何用一把锁保护多个资源在上一篇文章中,我们提到受保护资源和锁之间合理的关联关系应该是N:1的关系,也就是说可以用一把锁来保护多个资源,但是不能用多把锁来保护一个资源,并且结合文中示例,我们也重点强调了“不能用多把锁来保护一个资源”这个问题。而至于如何保护多个资源,我们今天...2026-01-19Java并发编程实战
5、一不小心就死锁了,怎么办在上一篇文章中,我们用Account.class作为互斥锁,来解决银行业务里面的转账问题,虽然这个方案不存在并发问题,但是所有账户的转账操作都是串行的,例如账户A 转账户B、账户C 转账户D这两个转账操作现实世界里是可以并行的,但是在这个方案里却被串...2026-01-19Java并发编程实战
6、用“等待、通知”机制优化循环等待由上一篇文章你应该已经知道,在破坏占用且等待条件的时候,如果转出账本和转入账本不满足同时在文件架上这个条件,就用死循环的方式来循环等待,核心代码如下: 123// 一次性申请转出账户和转入账户,直到成功while(!actr.apply(this, ...2026-01-19Java并发编程实战
7、安全性、活跃性以及性能问题通过前面六篇文章,我们开启了一个简单的并发旅程,相信现在你对并发编程需要注意的问题已经有了更深入的理解,这是一个很大的进步,正所谓只有发现问题,才能解决问题。但是前面六篇文章的知识点可能还是有点分散,所以是时候将其总结一下了。 并发编程中我们需要注意...2026-01-19Java并发编程实战
8、管程:并发编程的万能钥匙并发编程这个技术领域已经发展了半个世纪了,相关的理论和技术纷繁复杂。那有没有一种核心技术可以很方便地解决我们的并发问题呢?这个问题如果让我选择,我一定会选择管程技术。Java语言在1.5之前,提供的唯一的并发原语就是管程,而且1.5之后提供的SDK并...2026-01-19Java并发编程实战
9、Java线程(上):Java线程的生命周期在Java领域,实现并发程序的主要手段就是多线程。线程是操作系统里的一个概念,虽然各种不同的开发语言如Java、C#等都对其进行了封装,但是万变不离操作系统。Java语言里的线程本质上就是操作系统的线程,它们是一一对应的。 在操作系统层面,线程也有“...2026-01-19Java并发编程实战