Java并发
文章平均质量分 94
贤子磊
love and code
展开
-
ThreadLocal详解
一、什么是ThreadLocal我们先看一下API说明(1.8版本)/** * This class provides thread-local variables. These variables differ from * their normal counterparts in that each thread that accesses one (via its * {@code get} or {@code set} method) has its own, independently原创 2022-03-08 21:52:07 · 452 阅读 · 0 评论 -
LockSupport并发工具类详解
一、简介我们知道,AbstractQueuedSynchronizer(AQS)的核心包括同步队列(CLH)、CAS操作和LockSupport。其中AQS利用LockSupport来控制线程的状态,利用park和unpark实现线程的等待与唤醒,从而能够达到管理线程的目的。下面将为大家详细介绍LockSupport类。二、属性及构造方法1. 属性public class LockSupport { // Unsafe实例 private static final sun.misc.原创 2022-03-08 09:11:02 · 456 阅读 · 0 评论 -
聊一聊Java中的Unsafe类
一、Unsafe类简介如果看过JUC的源码,相信大家一定不会对Unsafe这个类陌生,整个JUC的底层核心就是这个Unsafe类。Unsafe类是位于sun.misc包下的一个类,它是jdk提供的一个直接访问操作系统资源的工具类(底层c++实现)。正如它的名字一样,这个类是不安全的,但是功能特别强大。那么它有什么样的强大功能呢?Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力。众所周知,相对于C和C++,Java语言使开发人员在开发时无需关注内存的管理,这些JVM全部自动处理了。但是如原创 2022-03-08 09:09:47 · 954 阅读 · 0 评论 -
Java并发之Condition详解
一、简介1. 什么是Condition任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、wait(long timeout)、notify()以及notifyAll()方法,这些方法与synchronized同步关键字配合,可以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者在使用方式以及功能特性上还是有差别的。——摘自《Java并发编程的艺术》下面是Cond原创 2022-03-05 11:50:02 · 1137 阅读 · 0 评论 -
Java并发工具之Semaphore
一、简介摘自《Java并发编程的艺术》一书Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。Semaphore一般用于流量的控制,特别是公共资源有限的应用场景。例如数据库的连接,假设数据库的连接数上线为10个,多个线程并发操作数据库可以使用Semaphore来控制并发操作数据库的线程个数最多为10个。二、类总览通过上面的类图可以看到,Semaphore与ReentrantLock的内部类的结构相同,类内部总共存在Sync、Nonf原创 2022-02-28 21:40:33 · 14831 阅读 · 1 评论 -
Java并发工具之CyclicBarrier
一、简介摘自《Java并发编程的艺术》一书中CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。CyclicBarrier,一个同步辅助类,在API中是这么介绍的: 它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,原创 2022-02-28 21:40:03 · 2057 阅读 · 0 评论 -
Java并发工具之CountDownLatch
一、简介CountDownLatch允许一个或多个线程等待其他线程完成操作。CountDownLatch,可以理解为倒计时工具,类似“三二一,芝麻开门”。该工具用于一组操作执行完成才能执行后续操作的场景。例如项目小组的晨会,需要等到所有人齐了才能正式开会。CountDownLatch是通过一个计数器来实现的,当我们在new一个CountDownLatch对象的时候初始化计数器的值,该值也代表了需要等待任务的完成数。每当一个线程完成自己的任务后,计数器的值就会减1。当计数器的值变为0时,就表示所有的原创 2022-02-28 21:39:32 · 576 阅读 · 0 评论 -
ReentrantReadWriteLock详解
一、简介1. 什么是读写锁前面我们介绍了ReentrantLock类,知道它的功能类似synchronized关键字,属于排它锁,同一时刻仅有一个线程可以进行访问。但是在大部分的场景下,读操作往往远大于写操作,其中读操作之前不存在数竞争关系,而写操作与其余的读写操作互斥。因此JDK为我们提供了读写锁——ReentrantReadWriteLock。读写锁维护着一对锁,一个读锁和一个写锁。通过分离读锁和写锁,使得并发性比一般的排他锁有了较大的提升:在同一时间可以允许多个读线程同时访问,但是在写线程访问时原创 2022-02-28 21:38:50 · 821 阅读 · 0 评论 -
ReentrantLock详解
一、简介1. Lock接口在讲ReentrantLock前,我们先熟悉一下Lock接口。在Lock接口出现之前,Java程序主要是靠synchronized关键字实现锁功能的,而JDK1.5之后,并发包中增加了Lock接口,它提供了与synchronized一样的锁功能。虽然它失去了像synchronize关键字隐式加锁解锁的便捷性,但是却拥有了锁获取和释放的可操作性,可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性。Lock接口的定义如下public interfa原创 2022-02-28 21:38:19 · 1123 阅读 · 0 评论 -
深入理解AQS实现原理
一、AQS简介1. 什么是AQSAQS全称为AbstractQueuedSynchronizer,翻译过来就是抽象队列同步器。AQS是一个用来构建锁和其他同步组件的基础框架,使用AQS可以简单且高效地构造出应用广泛的同步器,例如我们后续会讲到的ReentrantLock、Semaphore、ReentrantReadWriteLock和FutureTask等等。2. AQS的核心思想AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态原创 2022-02-28 21:37:43 · 3863 阅读 · 2 评论 -
深入理解volatile底层原理
一、前言之前我们学习过synchronized,知道它是一个重量级的锁,虽然jdk1.6对其做了很大的优化,但是成本还是较高。因此Java另一个关键字闪亮登场——volatile。volatile又被称为轻量级的synchronized,它在多处理器中保证了共享变量的可见性。volatile变量修饰符如果使用恰当的话,它比synchronized的使用和执行成本会更低。下面我们将深入剖析volatile的实现原理。二、什么是volatileJava语言规范第3版中对volatile的定义如下Jav原创 2022-02-28 21:37:12 · 4179 阅读 · 4 评论 -
深入理解final底层原理
一、简介final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。二、使用场景在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。1. 修饰类当用final修饰一个类时,表明这个类不能被继承。最常见是就是String类,任何类都无法继承它。public final class String implemen原创 2022-02-28 21:35:42 · 1875 阅读 · 0 评论 -
深入理解synchronized底层原理
一、前言在Java并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。下面来一起探索synchronized的特性、基本使用、底层实现以及JVM如何对synchronized进行优化。二、synchronized特性原子性原子性就是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。被synchronized修饰的类或对象的所有操原创 2020-09-30 17:11:35 · 690 阅读 · 0 评论 -
Java内存模型详解
一、前言1. 硬件内存架构就目前计算机而言,一般拥有多个CPU并且每个CPU可能存在多个核心,多核是指在一枚处理器(CPU)中集成两个或多个完整的计算引擎(内核),这样就可以支持多任务并行执行,从多线程的调度来说,每个线程都会映射到各个CPU核心中并行运行。在CPU内部有一组CPU寄存器,寄存器是CPU直接访问和处理的数据,是一个临时放数据的空间。一般CPU都会从内存取数据到寄存器,然后进行处理,但由于内存的处理速度远远低于CPU,导致CPU在处理指令时往往花费很多时间在等待内存做准备工作,于是在寄存器原创 2020-09-15 17:13:02 · 258 阅读 · 0 评论 -
Java并发编程基础
一、进程和线程进程进程(Process) 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。线程线程(thread) 是操作系统能够进行运算调度的最小单位。它被包含在原创 2020-09-14 19:16:02 · 169 阅读 · 0 评论