java全网最强并发系列教程

源码

https://github.com/javanan/Java-concurrency

Java并发系列(1)并发编程的优缺点

简介:
一直以来,硬件的发展极其迅速,也有一个很著名的"摩尔定律",可能会奇怪明明讨论的是并发编程为什么会扯到了硬件的发展,这其中的关系应该是多核CPU的发展为并发编程提供的硬件基础。摩尔定律并不是一种自然法则或者是物理定律,它只是基于认为观测数据后,对未来的一种预测。按照所预测的速度,我们的计算能力会按照指数级别的速度增长,不久以后会拥有超强的计算能力,正是在畅想未来的时候,2004年,Intel宣布4GHz芯片的计划推迟到2005年,然后在2004年秋季,Intel宣布彻底取消4GHz的计划,也就是说摩尔定律的有效性超过了半个世纪戛然而止。但是,聪明的硬件工程师并没有停止研发的脚步,他们为了进一步提升计算速度,而不是再追求单独的计算单元,而是将多个计算单元整合到了一起,也就是形成了多核CPU。短短十几年的时间,家用型CPU,比如Intel i7就可以达到4核心甚至8核心。而专业服务器则通常可以达到几个独立的CPU,每一个CPU甚至拥有多达8个以上的内核。因此,摩尔定律似乎在CPU核心扩展上继续得到体验。因此,多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。。。。。。。

Java并发系列(2)线程状态转换以及基本操作
简介:
一个java程序从main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上java程序天生就是一个多线程程序,包含了:(1)分发处理发送给给JVM信号的线程;(2)调用对象的finalize方法的线程;(3)清除Reference的线程;(4)main线程,用户程序的入口。那么,如何在用户程序中新建一个线程了,只要有三种方式:

通过继承Thread类,重写run方法;
通过实现runable接口;
通过实现callable接口这三种方式,下面看具体demo。。。。。

Java并发系列(3)Java内存模型以及happens-before

简介:
当多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替运行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获取正确的结果,那这个对象是线程安全的。

关于定义的理解这是一个仁者见仁智者见智的事情。出现线程安全的问题一般是因为主内存和工作内存数据不一致性和重排序导致的,而解决线程安全的问题最重要的就是理解这两种问题是怎么来的,那么,理解它们的核心在于理解java内存模型(JMM)。。。。。

Java并发系列(4)java关键字-synchronized
简介:
在上一篇博文中我们已经了解了java内存模型的一些知识,并且已经知道出现线程安全的主要来源于JMM的设计,主要集中在主内存和线程的工作内存而导致的内存可见性问题,以及重排序导致的问题,进一步知道了happens-before规则。线程运行时拥有自己的栈空间,会在自己的栈空间运行,如果多线程间没有共享的数据也就是说多线程间并没有协作完成一件事情,那么,多线程就不能发挥优势,不能带来巨大的价值。。。。。

Java并发系列(5)java关键字-volatile

简介:
在上一篇文章中我们深入理解了java关键字synchronized,我们知道在java中还有一大神器就是关键volatile,可以说是和synchronized各领风骚,其中奥妙,我们来共同探讨下。

通过上一篇的文章我们了解到synchronized是阻塞式同步,在线程竞争激烈的情况下会升级为重量级锁。而volatile就可以说是java虚拟机提供的最轻量级的同步机制。但它同时不容易被正确理解,也至于在并发编程中很多程序员遇到线程安全的问题就会使用synchronized。。。。。。。

Java并发系列(6)java关键字-final

简介:
final可以修饰变量,方法和类,用于表示所修饰的内容一旦赋值之后就不会再被改变,比如String类就是一个final类型的类。即使能够知道final具体的使用方法,

我想对final在多线程中存在的重排序问题也很容易忽略,希望能够一起做下探讨。。。。。。

Java并发系列(7)三大性质总结:原子性、可见性以及有序性

简介:
在并发编程中分析线程安全的问题时往往需要切入点,那就是两大核心:JMM抽象内存模型以及happens-before规则(在这篇文章中已经经过了),三条性质:原子性,有序性和可见性。

关于synchronized

和volatile

已经讨论过了,就想着将并发编程中这两大神器在 原子性,有序性和可见性上做一个比较,当然这也是面试中的高频考点,值得注意。。。。。

Java并发系列(8)初识Lock与AbstractQueuedSynchronizer(AQS)

简介:
需要注意的是synchronized同步块执行完成或者遇到异常是锁会自动释放,而lock必须调用unlock()方法释放锁,因此在finally块中释放锁。。。。。。。

Java并发系列(9)深入理解AbstractQueuedSynchronizer(AQS)

简介:
中我们对lock和AbstractQueuedSynchronizer(AQS)有了初步的认识。在同步组件的实现中,AQS是核心部分,

同步组件的实现者通过使用AQS提供的模板方法实现同步组件语义,AQS则实现了对同步状态的管理,以及对阻塞线程进行排队,

等待通知等等一些底层的实现处理。AQS的核心也包括了这些方面:同步队列,独占式锁的获取和释放,共享锁的获取和释放以及可中断锁,

超时等待锁获取这些特性的实现,而这些实际上则是AQS提供出来的模板方法,归纳整理如下:,,,,,,

Java并发系列(10)彻底理解ReentrantLock

简介:
ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,

即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性

(关于synchronized可以看这篇文章),

synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平锁和非公平锁两种方式。那么,

要想完完全全的弄懂ReentrantLock的话,主要也就是ReentrantLock同步语义的学习:1. 重入性的实现原理;2. 公平锁和非公平锁。。。。。。。。

Java并发系列(11)深入理解读写锁ReentrantReadWriteLock

简介:
在并发场景中用于解决线程安全的问题,我们几乎会高频率的使用到独占式锁,通常使用java提供的关键字synchronized

(关于synchronized可以看这篇文章)

或者concurrents包中实现了Lock接口的ReentrantLock。

它们都是独占式获取锁,也就是在同一时刻只有一个线程能够获取锁。而在一些业务场景中,大部分只是读数据,写数据很少,

如果仅仅是读数据的话并不会影响数据正确性(出现脏读),而如果在这种业务场景下,依然使用独占锁的话,很显然这将是出现性能瓶颈的地方。

针对这种读多写少的情况,java还提供了另外一个实现Lock接口的ReentrantReadWriteLock(读写锁)。读写所允许同一时刻被多个读线程访问,

但是在写线程访问时,所有的读线程和其他的写线程都会被阻塞。在分析WirteLock和ReadLock的互斥性时可以按照WriteLock与WriteLock之间,。。。。。。。

Java并发系列(12)详解Condition的await和signal等待通知机制

简介:
任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,

比如wait(),wait(long timeout),wait(long timeout, int nanos)与notify(),notifyAll()几个方法实现等待/通知机制,

同样的, 在java Lock体系下依然会有同样的方法实现等待/通知机制。

从整体上来看Object的wait和notify/notify是与对象监视器配合完成线程间的等待/通知机制,而Condition与Lock配合完成等待通知机制,

前者是java底层级别的,后者是语言级别的,具有更高的可控制性和扩展性。两者除了在使用方式上不同外,在功能特性上还是有很多的不同:。。。。。。

Java并发系列(13)LockSupport工具

Java并发系列(14)并发容器之ConcurrentHashMap(JDK 1.8版本)

Java并发系列(15)并发容器之ConcurrentLinkedQueue

Java并发系列(16)并发容器之CopyOnWriteArrayList

Java并发系列(17)并发容器之ThreadLocal

Java并发系列(18)从源码深入详解ThreadLocal内存泄漏问题

Java并发系列(19)并发容器之BlockingQueue

Java并发系列(20)ArrayBlockingQueue和LinkedBlockingQueue

Java并发系列(21)线程池ThreadPoolExecutor实现原理

Java并发系列(22)线程池之ScheduledThreadPoolExecutor

Java并发系列(23)FutureTask基本操作总结

Java并发系列(24)Java中atomic包中的原子操作类总结

Java并发系列(25)并发工具类-CountDownLatch,CyclicBarrier

Java并发系列(26)大白话说并发工具类-Semaphore,Exchanger

Java并发系列(27)一文看懂消费者–生产者

Java并发系列(28)java并发知识图谱

思维导图

image.png

image.png

发布了173 篇原创文章 · 获赞 195 · 访问量 45万+

猜你喜欢

转载自blog.csdn.net/chenjianandiyi/article/details/103854084