Java并发编程
文章平均质量分 95
Java并发编程学习笔记,欢迎阅读。
海陆云
请洒潘江,各倾陆海云尔
展开
-
面向对象思想写好并发程序
面向对象思想写好并发程序前言一、封装共享变量二、识别共享变量间的约束条件三、制定并发访问策略总结前言在工作中很多时候在设计之初都是直接按照单线程的思路来写程序的,而忽略了本应该重视的并发问题;等上线后的某天,突然发现诡异的 Bug,再历经千辛万苦终于定位到问题所在,却发现对于如何解决已经没有了思路。面向对象思想与并发编程本来是没关系的,它们分属两个不同的领域,但是在 Java 语言里,这两个领域被融合在一起了,融合的效果还是不错的:在 Java 语言里,面向对象思想能够让并发编程变得更简单。用面原创 2022-01-09 23:10:09 · 27623 阅读 · 0 评论 -
局部变量是线程安全
局部变量是线程安全前言方法是如何被执行的局部变量存哪里?调用栈与线程线程封闭总结前言多个线程同时访问共享变量的时候,会导致并发问题。那在 Java 语言里,是不是所有变量都是共享变量呢?比如,下面代码里的 fibonacci() 这个方法,会根据传入的参数 n ,返回 1 到 n 的斐波那契数列,斐波那契数列类似这样: 1、1、2、3、5、8、13、21、34……第 1 项和第 2 项是 1,从第 3 项开始,每一项都等于前两项之和。在这个方法里面,有个局部变量:数组 r 用来保存数列的结果,每次原创 2022-01-09 22:33:13 · 27130 阅读 · 0 评论 -
创建多少线程才是合适的
创建多少线程才是合适的前言为什么要使用多线程?多线程的应用场景创建多少线程合适?总结前言在 Java 领域,实现并发程序的主要手段就是多线程,使用多线程还是比较简单的,但是使用多少个线程却是个困难的问题。工作中,经常有人问,“各种线程池的线程数量调整成多少是合适的?”或者“Tomcat 的线程数、Jdbc 连接池的连接数是多少?”等等。那我们应该如何设置合适的线程数呢?要解决这个问题,首先要分析以下两个问题:为什么要使用多线程?多线程的应用场景有哪些?为什么要使用多线程?使用多线程,本原创 2022-01-04 23:17:36 · 28551 阅读 · 0 评论 -
Java线程的生命周期
Java线程的生命周期前言通用的线程生命周期Java 中线程的生命周期1.RUNNABLE 与 BLOCKED 的状态转换2.RUNNABLE 与 WAITING 的状态转换3.RUNNABLE 与 TIMED_WAITING 的状态转换4.从 NEW 到 RUNNABLE 状态5. 从 RUNNABLE 到 TERMINATED 状态总结前言在 Java 领域,实现并发程序的主要手段就是多线程。线程是操作系统里的一个概念,虽然各种不同的开发语言如 Java、C# 等都对其进行了封装,但是万变不离操原创 2022-01-04 22:44:53 · 27713 阅读 · 1 评论 -
安全性、活跃性以及性能问题
安全性、活跃性以及性能问题前言安全性问题活跃性问题性能问题总结前言通过前面六篇文章,我们开启了一个简单的并发旅程,相信现在你对并发编程需要注意的问题已经有了更深入的理解,这是一个很大的进步,正所谓只有发现问题,才能解决问题。但是前面六篇文章的知识点可能还是有点分散,所以是时候将其总结一下了。并发编程中我们需要注意的问题有很多,很庆幸前人已经帮我们总结过了,主要有三个方面,分别是:安全性问题、活跃性问题和性能问题。下面我就来一一介绍这些问题。安全性问题相信你一定听说过类似这样的描述:这个方法不是原创 2022-01-03 23:16:33 · 27187 阅读 · 0 评论 -
用“等待-通知”机制优化循环等待
用“等待-通知”机制优化循环等待前言完美的就医流程用 synchronized 实现等待 - 通知机制小试牛刀:一个更好地资源分配器尽量使用 notifyAll()总结前言在破坏占用且等待条件的时候,如果转出账本和转入账本不满足同时在文件架上这个条件,就用死循环的方式来循环等待,核心代码如下:/ 一次性申请转出账户和转入账户,直到成功while(!actr.apply(this, target)) ;如果 apply() 操作耗时非常短,而且并发冲突量也不大时,这个方案还挺不错的,因为这原创 2022-01-03 23:11:00 · 26873 阅读 · 0 评论 -
解决并发时的死锁问题
解决并发时的死锁问题前言向现实世界要答案没有免费的午餐如何预防死锁1. 破坏占用且等待条件2. 破坏不可抢占条件3. 破坏循环等待条件总结前言用 Account.class 作为互斥锁,解决银行业务里面的转账问题,虽然这个方案不存在并发问题,但是所有账户的转账操作都是串行的,例如账户 A 转账户 B、账户 C 转账户 D 这两个转账操作现实世界里是可以并行的,但是在这个方案里却被串行化了,性能太差。试想互联网支付盛行的当下,8 亿网民每人每天一笔交易,每天就是 8 亿笔交易;每笔交易都对应着一次转原创 2021-12-31 23:34:50 · 29847 阅读 · 0 评论 -
一把互斥锁保护多个资源
一把互斥锁保护多个资源前言保护没有关联关系的多个资源保护有关联关系的多个资源使用锁的正确姿势总结前言在上一篇文章中,我们提到受保护资源和锁之间合理的关联关系应该是 N:1 的关系,也就是说可以用一把锁来保护多个资源,但是不能用多把锁来保护一个资源,并且结合文中示例,我们也重点强调了“不能用多把锁来保护一个资源”这个问题。而至于如何保护多个资源,我们今天就来聊聊。当我们要保护多个资源时,首先要区分这些资源是否存在关联关系。保护没有关联关系的多个资源在现实世界里,球场的座位和电影院的座位就是没有关原创 2021-12-31 23:26:30 · 21166 阅读 · 0 评论 -
互斥锁解决并发原子性问题
互斥锁解决原子性问题前言简易锁模型改进后的锁模型Java 语言提供的锁技术:synchronized用 synchronized 解决 count+=1 问题锁和受保护资源的关系总结前言一个或者多个操作在 CPU 执行的过程中不被中断的特性,称为“原子性”。理解这个特性有助于分析并发编程 Bug 出现的原因,例如利用它可以分析出 long 型变量在 32 位机器上读写可能出现的诡异 Bug,明明已经把变量成功写入内存,重新读出来却不是自己写入的。原子性问题的源头是线程切换,如果能够禁用线程切换就能原创 2021-12-30 22:54:00 · 22670 阅读 · 0 评论 -
管程模型解决并发编程
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档管程模型解决并发编程前言什么是管程MESA 模型wait() 的正确姿势notify() 何时可以使用总结前言管程技术可以很方便地解决并发问题。Java 语言在 1.5 之前,提供的唯一的并发原语就是管程,而且 1.5 之后提供的 SDK 并发包,也是以管程技术为基础的。除此之外,C/C++、C# 等高级语言也都支持管程。管程就是一把解决并发问题的万能钥匙。什么是管程为什么 Java 在 1.5 之前仅仅提供了 synchroni原创 2021-12-30 22:32:08 · 22473 阅读 · 0 评论 -
Java 内存模型解决可见性和有序性导致的并发问题
Java 内存模型解决可见性和有序性导致的并发问题前言什么是 Java 内存模型?使用 volatile 的困惑Happens-Before 规则1. 程序的顺序性规则2. volatile 变量规则3. 传递性4. 管程中锁的规则5. 线程 start() 规则6. 线程 join() 规则7. 被忽视的 final总结前言在并发场景中,因可见性、原子性、有序性导致的问题常常会违背我们的直觉,从而成为并发编程的 Bug 之源。这三者在编程领域属于共性问题,所有的编程语言都会遇到,Java 在诞生之原创 2021-12-29 23:23:50 · 23259 阅读 · 0 评论 -
Java并发编程:可见性、原子性和有序性问题
文章目录前言并发程序幕后的故事源头之一:缓存导致的可见性问题源头之二:线程切换带来的原子性问题源头之三:编译优化带来的有序性问题前言如果你细心观察的话,你会发现,不管是哪一门编程语言,并发类的知识都是在高级篇里。换句话说,这块知识点其实对于程序员来说,是比较进阶的知识。我自己这么多年学习过来,也确实觉得并发是比较难的,因为它会涉及到很多的底层知识,比如若你对操作系统相关的知识一无所知的话,那去理解一些原理就会费些力气。这是我们整个专栏的第一篇文章,我说这些话的意思是如果你在中间遇到自己没想通的问题,原创 2021-12-29 22:43:27 · 28455 阅读 · 0 评论