Java多线程编程核心技术
文章平均质量分 94
Java 多线程编程,从线程说起,一直到 Java 8 并发包常用工具类。一步步深入讲解原理,偶尔深入点源代码,一起探索多线程的奥秘!
徐刘根
微信关注公众号:Java后端技术(ID:JavaITWork),和20万人一起学习Java!
"Java后端技术"微信公众号专注Java相关技术:SSM、Spring全家桶、微服务、MySQL、MyCat、集群、分布式、中间件、Linux、网络、多线程,偶尔讲点运维Jenkins、Nexus、Docker、ELK,偶尔分享些技术干货,致力于Java全栈开发!
展开
-
Java多线程编程-(1)-线程安全和锁Synchronized概念
一、进程与线程的概念(1)在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单位都是进程。在未配置 OS 的系统中,程序的执行方式是顺序执行,即必须在一个程序执行完后,才允许另一个程序执行;在多道程序环境下,则允许多个程序并发执行。程序的这两种执行方式间有着显著的不同。也正是程序并发执行时的这种特征,才导致了在操作系统中引入进程的概念。自从在 20 世纪 60 年代人...原创 2017-09-15 14:51:59 · 26008 阅读 · 17 评论 -
Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性
上一篇:Java多线程编程-(1)-线程安全和锁Synchronized概念基本介绍了进程和线程的区别、实现多线程的两种方式、线程安全的概念以及如何使用Synchronized实现线程安全,下边介绍一下关于Synchronized的其他基本特性。一、Synchronized锁重入(1)关键字Synchronized拥有锁重入的功能,也就是在使用Synchronized的时候,当...原创 2017-09-16 18:02:44 · 7935 阅读 · 3 评论 -
Java多线程编程-(3)-线程本地ThreadLocal的介绍与使用
上一篇:Java多线程编程-(1)-线程安全和锁Synchronized概念Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性ThreadLocal简介我们通过上两篇的学习,我们已经知道了变量值的共享可以使用public static变量的形式,所有的线程都使用同一个被public static修饰的变量。那么如果我们想实现每一个线程都有自己的共享变量该如何解决哪?JDK原创 2017-09-27 16:26:56 · 7929 阅读 · 0 评论 -
Java多线程编程-(4)-线程间通信机制的介绍与使用
上一篇:Java多线程编程-(1)-线程安全和锁Synchronized概念Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性Java多线程编程-(3)-线程本地ThreadLocal的介绍与使用线程间通信简介我们知道线程是操作系统中独立的个体,但是这个单独的个体之间没有一种特殊的处理方式使之成为一个整体,线程之间没有任何交流和沟通的话,他就是一个个单独的个体,不足以形成原创 2017-10-10 18:25:52 · 7575 阅读 · 14 评论 -
Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信
前几篇:Java多线程编程-(1)-线程安全和锁Synchronized概念Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性Java多线程编程-(3)-线程本地ThreadLocal的介绍与使用Java多线程编程-(4)-线程间通信机制的介绍与使用在《Java多线程编程-(4)-线程间通信机制的介绍与使用》已经学习了,可以使用方法wait/notify 结合同步关键字s原创 2017-10-10 21:14:50 · 7878 阅读 · 2 评论 -
Java多线程编程-(6)-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier
前几篇:Java多线程编程-(1)-线程安全和锁Synchronized概念Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性Java多线程编程-(3)-线程本地ThreadLocal的介绍与使用Java多线程编程-(4)-线程间通信机制的介绍与使用Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信倒计时CountDownLatchCountDownLat原创 2017-10-12 19:32:49 · 8153 阅读 · 3 评论 -
Java多线程编程-(7)-使用线程池实现线程的复用和一些坑的避免
前几篇:Java多线程编程-(1)-线程安全和锁Synchronized概念Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性Java多线程编程-(3)-线程本地ThreadLocal的介绍与使用Java多线程编程-(4)-线程间通信机制的介绍与使用Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信Java多线程编程-(6)-两种...原创 2017-10-16 19:20:20 · 13160 阅读 · 4 评论 -
Java多线程编程-(8)-多图深入分析ThreadLocal原理
前几篇:Java多线程编程-(1)-线程安全和锁Synchronized概念Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性Java多线程编程-(3)-线程本地ThreadLocal的介绍与使用Java多线程编程-(4)-线程间通信机制的介绍与使用Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信Java多线程编程-(6)-两种常用的线程计数器Count原创 2017-10-20 17:15:13 · 23030 阅读 · 17 评论 -
Java多线程编程-(9)-ThreadLocal造成OOM内存溢出案例演示与原理分析
前几篇: Java多线程编程-(1)-线程安全和锁Synchronized概念Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性Java多线程编程-(3)-线程本地ThreadLocal的介绍与使用Java多线程编程-(4)-线程间通信机制的介绍与使用Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信Java多线程编程-(6)-两种...原创 2017-10-20 19:53:26 · 21560 阅读 · 21 评论 -
Java多线程编程-(10)-单例模式几种写法的错与对
前几篇: Java多线程编程-(1)-线程安全和锁Synchronized概念Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性Java多线程编程-(3)-线程本地ThreadLocal的介绍与使用Java多线程编程-(4)-线程间通信机制的介绍与使用Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信Java多线程编程-(6)-两...原创 2017-10-22 15:33:09 · 3605 阅读 · 4 评论 -
Java多线程编程-(11)-从volatile和synchronized的底层实现原理看Java虚拟机对锁优化所做的努力
一、背景对于Java来说我们知道,Java代码首先会编译成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上进行执行。Java中所使用的并发机制依赖于JVM的实现和CPU的指令。下边我们对常见的实现同步的两个关键字volatile和synchronized进行底层原理的分析,分析之余我们就会了解到JVM在对锁的优化所做的事情,这样的话我们以后在使用这两原创 2017-10-24 10:57:11 · 10884 阅读 · 1 评论 -
Java多线程编程-(12)-Java中的队列同步器AQS和ReentrantLock锁原理简要分析
一、Lock接口在上一篇文章中: Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信 介绍了如何使用Lock实现和synchronized关键字类似的同步功能,只是Lock在使用时需要显式地获取和释放锁,synchronized实现的隐式的获取所和释放锁。虽然Lock它缺少了(通过synchronized块或者方法所提供的)隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的可操作性、原创 2017-10-25 15:01:34 · 3737 阅读 · 0 评论 -
Java多线程编程-(13)- 关于锁优化的几点建议
上一篇:Java多线程编程-(11)-从volatile和synchronized的底层实现原理看Java虚拟机对锁优化所做的努力Java多线程编程-(12)-Java中的队列同步器AQS和ReentrantLock锁原理简要分析一、背景在《 Java多线程编程-(11)-从volatile和synchronized的底层实现原理看Java虚拟机对锁优化所做的努力》 这一篇文章中,我们大致介绍了Ja原创 2017-10-27 12:37:00 · 6982 阅读 · 0 评论 -
Java多线程编程-(14)-无锁CAS操作以及Java中Atomic并发包的“18罗汉”
对于并发控制而言,锁是一种**悲观的策略**。它总是假设每一次的临界区操作会产生冲突,因此,必须对每次操作都小心翼翼。如果有多个线程同时需要访问临界区资源,就宁可牺牲性能让线程进行等待,所以说锁会阻塞线程执行。 而无锁是一种**乐观的策略**,它会假设对资源的访问是没有冲突的。既然没有冲突,自然不需要等待,所以所有的线程都可以在不停顿的状态下持续执行。那遇到冲突怎么办呢?无锁的策略使用一种叫做**比较交换的技原创 2017-10-27 14:02:58 · 2071 阅读 · 0 评论 -
Java多线程编程-(15)-读写锁ReentrantReadWriteLock深入分析
上两篇:Java多线程编程-(12)-Java中的队列同步器AQS和ReentrantLock锁原理简要分析Java多线程编程-(13)- 关于锁优化的几点建议一、前言上两篇的内容中已经介绍到了锁的实现主要有ReentrantLock和ReentrantReadWriteLock。ReentrantLock是重入锁,顾名思义就是支持重进入的锁,他表示该锁能够支持一个线程对资源的重复加锁,上文中已经提原创 2017-10-28 15:06:39 · 1938 阅读 · 0 评论 -
Java多线程编程-(16)-等待/通知模式接口Condition接口深入分析
前几篇:Java多线程编程-(12)-Java中的队列同步器AQS和ReentrantLock锁原理简要分析Java多线程编程-(15)-读写锁ReentrantReadWriteLock深入分析一、Condition接口简介在上述两篇文章中讲解AQS的时候,我们已经知道了同步队列AQS的内部类ConditionObject实现了Condition接口,使用ReentrantLock和Reentra原创 2017-10-29 10:13:50 · 5118 阅读 · 0 评论 -
Java多线程编程-(17)-多线程异步调用之Future模式
一、线程计数器回顾在《Java多线程编程-(6)-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier》 这一篇中,我们使用线程计数器的方式实现了在主线程中等待计数的线程执行完之后在执行阻塞等待之后的代码。看段代码回顾一下:public class SummonDragonDemo { private static final int THREAD_COUNT原创 2017-10-30 10:27:27 · 17005 阅读 · 3 评论 -
Java多线程编程-(18)-借ThreadLocal出现OOM内存溢出问题再谈弱引用WeakReference
前两篇:Java多线程编程-(3)-线程本地ThreadLocal的介绍与使用Java多线程编程-(8)-多图深入分析ThreadLocal原理Java多线程编程-(9)-ThreadLocal造成OOM内存溢出案例演示与原理分析一、简单回顾在上几篇的时候,已经简单的介绍了不正当的使用ThreadLocal造成OOM的原因,以及ThreadLocal的基本原理,下边我们首先回顾一下ThreadLoc原创 2017-11-12 18:57:16 · 8909 阅读 · 5 评论