Java多线程与高并发
文章平均质量分 83
讲述java多线程的知识点与生产实践
@ Zoey
如果世界上真的有奇迹,那一定是努力的另一个名字
展开
-
锁与CAS机制
锁与CAS机制。原创 2020-05-30 11:26:57 · 10704 阅读 · 3 评论 -
JMM设计思路
JMM设计思路(一)为什么需要JMM下面为现代处理器架构模型图:当前的处理器架构大多是:多核+多级缓存+主存的模式,这样在多线程场景下就存在数据竞争从而造成缓存不一致的问题。另外,CPU可能会对程序进行优化,进行指令重排序,只要指令重排序后程序的语义没有发生变化,指令重排就是有可能发生的(编译器和JVM也存在指令重排),但这有时会让多线程执行的结果我们的出乎意料。对处理器来说,内存模型定义了充分必要条件,以保证其他处理器对内存的写入对当前处理器可见,而当前处理器的写入对其他处理器可见。一些处理器使原创 2020-07-07 09:10:55 · 7987 阅读 · 0 评论 -
原子性、可见性、有序性解决方案
原子性、可见性、有序性解决方案(一)原子性原子性是指:一个或多个操作,要么全部执行且在执行过程中不被任何因素打断,要么全部不执行。在Java中当我们讨论一个操作具有原子性问题是一般就是指这个操作会被线程的随机调度打断。JMM对原子性的保证大概分以下几种类型:java自带原子性、synchronized、Lock锁、原子操作类(CAS)。下面我们来一个一个细说。1. java自带原子性在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,但是long和double类型是64位,在32位JV原创 2020-07-11 09:38:27 · 9068 阅读 · 2 评论 -
自上而下拆解Synchronized
自上而下拆解Synchronized(一)概述Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:原子性:确保线程互斥的访问同步代码。可见性:保证共享变量的修改能够及时可见,其实是通过Java内存模型中的 “对一个变量unlock操作之前,必须要同步到主内存中,如果对一个变量进行lock操作,则将会清空工作内存中此变量的值,在执行引擎使用此变量前,需要重新从主内存中load操作或assign操作初始化变量值” 来保证的原创 2020-10-15 17:40:51 · 2502 阅读 · 2 评论 -
自上而下拆解Volatile
自上而下拆解Volatile(一)概述上一篇文章中我们拆解讨论了synchronized关键字,这次我们来谈谈volatile关键字。个人认为,volatile比synchronized关键字更复杂,考的也更多。volatile关键字是Java中提供的一种解决可见性和有序性问题的方案,只能作用于变量(这点与synchronized不同,要注意)。在我的另一篇文章《原子性、可见性、有序性解决方案》里面大概提过一点关于volatile的知识,不过不是特别深入。另外,在看本文之前,极力推荐大家先去了解JMM原创 2020-10-26 13:51:28 · 1945 阅读 · 0 评论 -
线程中必不可少的ThreadLocal
ThreadLocal详解(一)概述通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK中提供的ThreadLocal类正是为了解决这样的问题。 ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。(二)基本使用如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的本地副本,这也是ThreadLo原创 2020-11-20 16:31:24 · 1827 阅读 · 1 评论 -
Java中线程池的使用和原理分析
Java中线程池的使用(一)概述我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecutor类中的方法讲起原创 2020-11-28 19:09:02 · 1282 阅读 · 0 评论 -
从AQS到ReentrantLock核心源码分析
从AQS到ReentrantLock源码分析(一)概述Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。上图展现了AQS的全貌,可以发现还是非常复杂的。对于我们开发者来说,我们需要关注的是其中的API层中的方法,因为,这是我们自定义同步器需要重写的方法,因为我们需要写自己的逻辑来满足需求,其他方法都是A原创 2020-12-04 19:51:32 · 1369 阅读 · 0 评论