
Java 并发编程实践之路
笔者曾反复阅读过《Java 并发编程实践》这本书,并且阅读了 JDK 并发包的中常见工具类的源码内容。加之,这么多年工作中也踩过不少并发的坑,所以萌发了写完整专栏的想法。从本周起,笔者将以一天三篇的速度更新 Java 并发编程的技术实践之路,欢迎大家订阅指正!
毕小宝
从事 Java 开发 7 年+,精于 Java 服务器端程序开发,熟悉设计模式及其在各大主流框架中的应用原理,研究过 Java 并发包源码,搭建过 ORM 框架。路漫漫,仍然在路上的 Java 程序员!
-
原创 基础篇:独占锁、共享锁、公平锁、非公平锁,叫我如何分得清
背景本文继续讲解 Java 并发编程实践的基础篇,独占锁和共享锁,它跟上一篇的内置锁和显式锁的具体的实现策略。锁的独占与共享java并发包提供的加锁模式分为独占锁和共享锁,独占锁模式下,每次只能有一个线程能持有锁,ReentrantLock就是以独占方式实现的互斥锁。共享锁,则允许多个线程同时获取锁,并发访问 共享资源,如:ReadWriteLock。AQS的内部类Node定义了两个常量SH...2019-12-21 10:08:11621
0
-
原创 Java 并发编程技术实践之路专栏导读
背景拟准备重新整理一下 Java 并发编程相关的技术知识,系统并完善地介绍自己阅读 Java 并发包源码的心得,并结合工作中碰到的有关并发的问题,写一个关于 Java 并发编程的专栏系列。此篇为开题导读,让我们来回顾一下 Java 并发相关的知识图谱。...2019-12-19 22:57:18316
3
-
原创 基础篇:内置锁和显式锁摸底
内置锁和显式锁是 Java 的两种不同加锁机制,在实际开发中是互斥的,只能选择一种方式,不能混用。笔者近几年在 CSDN 问答模块看到不少关于 synchronized 和 wait、notify 的提问,意识到这可能是初学者不太容易理明白的问题,所以本文来整理下二者的用法和注意事项。内置锁和显式锁内置锁和显式锁完成简单的同步代码逻辑,这里的简单是不使用条件队列的情况下,其实没什么特别注意的...2019-12-20 09:40:23436
0
-
原创 实践篇:如何编写线程安全的类
文章目录引言线程安全的几种实现设计不变的类引言并发环境下设计线程安全的类,一个类如果是不变的,那么它一定就是线程安全的。这是设计模式中不变模式的一种,一个对象在创建之后,它的状态就不会再发生变化,它就是不变类。java中的String,各种基本类型的封装类型,都是不变类。在设计任何一个类的时候,应当慎重考虑其状态是否有需要变化的可能性。如果其状态没有变化的必要,那么就应当将它设计成不变类。线...2019-12-31 12:15:41218
0
-
原创 干货篇:论线程池资源关闭的重要性
引言本文是根据笔者去年写的一篇付费文章整理而来的,主要介绍 Java Web 应用中线程池资关闭的重要性。背景是这样的,笔者去年参与了一个小项目的开发,部署测试环境时得知客户要求使用 jboss 企业版作为 web服务器。笔者之前参与的所有项目都是基于Tomcat 的,测试时直接重启Tomcat,没遭遇过JVM 内存泄露问题。本文将以本人在 jboss 服务器下部署测试的工作经历,聊聊 Ja...2019-12-26 18:38:01293
0
-
原创 并发案例:如何保证统计变量的原子性
文章目录引言i++ 数据不一致案例分析案例描述问题分析解决办法AtomicInteger 原子类概述案例描述问题分析延伸测试启示录引言i++ 这个简单的语句,想必大家都不陌生,但是在多线程环境下,如果 i 是一个全局共享变量,那么它还能正确地按顺序累加吗?这就是本文要介绍的内容,如何保证统计变量的原子性。其实,i++ 是由 “读取-修改-写入” 三个操作序列组成的复合操作,应该保证它们的原子...2019-12-25 12:21:38197
0
-
原创 并发案例:Java 操作 SQLite 数据库踩坑记
SQLite 数据库基础SQLite 是一个 C 语言库,它实现了一个小型、快速、自包含、高可靠性、功能齐全的 SQL 数据库引擎。SQLite 是什么呢? Sqlite 官网 是这样描述它的:SQLite is a C-language library that implements a small, fast, self-contained, high-reliability, full...2019-07-21 14:43:091392
2
-
原创 并发案例:CyclicBarrier 使用不当导致死锁问题分析
文章目录引言功能分析单线程调度死锁问题复盘打破死锁的方法编程启示录引言前文讲述了 CyclicBarrier 和 CountDownLatch 的基本用法,本文笔者将给大家复盘一个 CyclicBarrier 使用不当导致线程饥饿死锁的踩坑经历。今年年初的时候,笔者写过一个简单的应用,对不同 Linux 系统的防火墙文件进行解析,将 NAT 转换信息解析后存入数据库。本来每个文件都不大,单...2019-12-24 20:34:22378
0
-
原创 基础篇: CyclicBarrier 和 CountDownLatch 概述
文章目录背景Java 并发知识思维导图CyclicBarrier 基本用法构造方法实践编码测试类结果分析CountDownLatch 用法概述使用案例编程启示录背景电脑桌面上有一张“Java 并发编程知识思维导图”,最近刚好又用到了 CyclicBarrier 类,这是一篇笔者周末总结的 CyclicBarrier 用法的旧文,今天再对此文修正调整后正好作为专栏的一部分。Java 并发知识思...2019-12-24 20:20:46185
0
-
原创 死锁篇:线程饥饿死锁问题
文章目录引言线程饥饿死锁资源死锁Timer 定时器死锁分析引言线程饥饿死锁《Java并发编程实践》中对线程饥饿死锁的解释是这样的:在使用线程池执行任务时,如果任务依赖于其他任务,那么就可能产生死锁问题。在单线程的Executor中,若果一个任务将另一个任务提交到同一个Executor,并且等待这个被提交的任务的结果,那么这必定会导致死锁。第一个任务在工作队列中,并等待第二个任务的结果;而第二...2019-12-24 19:11:19348
0
-
原创 死锁篇:协作对象死锁问题
协作对象间的死锁问题在协作对象之间可能存在多个锁获取的情况,但是这些获取多个锁的操作并不像在LeftRightDeadLock或transferMoney中那么明显,这两个锁并不一定必须在同一个方法中被获取。如果在持有锁时调用某个外部方法,那么这就需要警惕死锁问题,因为在这个外部方法中可能会获取其他锁,或者阻塞时间过长,导致其他线程无法及时获取当前被持有的锁。《java并发编程实践》中出租车调...2019-12-23 18:19:33275
0
-
原创 死锁篇:锁顺序死锁问题
文章目录引言什么是锁顺序死锁动态的锁顺序死锁实践启示录引言初次接触死锁的概念是大学的一门课程《操作系统原理》中描述的“哲学家进餐”问题。操作系统中,由于各个进程共享系统资源而可能出现死锁问题。同样 Java 多线程环境下,也存在资源共享导致的死锁问题。当一组Java 线程发生死锁时,程序有可能就此阻塞,而无法正常结束。Java 应用程序中,我们使用加锁机制来确保线程的安全,但是如果过度地使用加锁,可能...2019-12-23 11:30:03314
0
-
原创 源码篇:ThreadPoolExecutor 任务饱和策略验证
文章目录引言策略一:通知模式抛弃策略二:静音模式抛弃策略三:限制提交策略四:调用者执行引言使用java的任务管理框架的线程池执行任务时,线程池的任务等待队列被填满时,饱和策略开始发挥作用。ThreadPollExecutor的饱和策略通过setRejectedExecutionHandler来修改。JDK提供了4中饱和策略如下:策略一:通知模式抛弃AbortPolicy是默认的饱和策略,...2019-12-22 19:20:19246
0
-
原创 源码篇:ThreadPoolExecutor 源码阅读笔记
文章目录引言线程扩容机制线程池提交任务的流程任务饱和策略引言java并发包中的任务调度框架Executor的实现类ThreadPoolExecutor的源码阅读。线程扩容机制ThreadPoolExecutor提供了某些Executor的基本实现,是一个灵活的、稳定的、支持定制的线程池。首先,类结构图如下:线程池维护着三个容量变量poolSize、corePoolSize、maxPoo...2019-12-22 11:54:03143
0
-
原创 源码篇:ReentrantLock 源码分析下篇
文章目录引言lock 和 lockInterruptibly 的区别lock 源码lockInterruptibly 源码条件队列条件队列的节点状态等待和唤醒操作引言上一节介绍了 ReentrantLock 类的 lock 锁获取流程,本节主要介绍两个知识点:lock 和 lockInterruptibly的区别条件队列的实现逻辑lock 和 lockInterruptibly 的区...2019-12-21 17:30:49154
0
-
原创 源码篇:ReentrantLock 源码分析上篇
文章目录引言类图结构公平锁NonfairSync 锁引言AQS ,全称「 AbstratcQueuedSynchronizer 」,它是Java 的显式锁实现的基础框架,本质是一个队列结构,以先进先出的方式维护线程的阻塞和唤醒。JDK 源码中,AbstratcQueuedSynchronizer 类定义时的注释是这样写的:Provides a framework for implemen...2019-12-21 12:20:19146
0
-
原创 基础篇:内置锁实现生产者和消费者模型
“生产者和消费者模型” 是多线程通信的典型案例,本章节将利用前一节的锁和条件队列的知识,来实现一个完整的有界缓冲区,并创建多个线程访问该有界缓冲区,模拟生产者提供数据、消费者处理数据的过程。2019-12-20 19:19:53308
1