
《并发编程》系列
文章平均质量分 86
Java并发编程全面知识点,高级程序员必备知识,大厂敲门砖
李子捌
优快云博客专家、InfoQ 100大签约作者、阿里云博客专家、华为云专家
展开
-
看看我给面试官是如何娓娓道来synchronized锁升级过程的
知乎高赞,看看我给面试官是如何娓娓道来synchronized锁升级过程的!!!原创 2021-12-06 09:06:09 · 1143 阅读 · 9 评论 -
面试官synchronized连环问,学会Monitor之后轻松拿下
知乎高赞!!!!我们Java程序员编码时谈论的最多的两个字就是对象,Java中几乎所有的技术都是围绕对象展开。本文将要讲述的Monitor并不是Java对象,而是在操作系统中关联的“对象”,Monitor是Java重量级锁synchronized实现的关键,因此学习Java单机同步机制就离不开对Monitor的剖析。Monitor经常被人们称为监视器锁和管程。原创 2021-12-02 21:33:51 · 1841 阅读 · 0 评论 -
面试还在死记硬背?图解才是永远滴神——图解虚拟机栈和栈帧
图解栈帧,告别死记硬背原创 2021-11-30 15:59:05 · 2453 阅读 · 5 评论 -
如何查看Java进程和线程?你get了没?
如何查看Java进程和线程你get了吗?原创 2021-11-27 11:33:59 · 6334 阅读 · 13 评论 -
线程的三种创建方式你get了吗?
创建线程的方式有三种,Thread、Runnable+Thread、Callable+FutureTask+Thread;这三者如何选择呢?原创 2021-11-27 11:29:52 · 704 阅读 · 1 评论 -
同步与异步区别
备战2022春招或暑期实习,祝大家每天进步亿点点!Java并发编程Day3原创 2021-11-25 23:16:08 · 1516 阅读 · 1 评论 -
并行与并发区别
备战2022春招或暑期实习,祝大家每天进步亿点点!Java并发编程Day2原创 2021-11-25 23:13:44 · 1191 阅读 · 0 评论 -
进程与线程的区别
备战2022春招或暑期实习,祝大家每天进步亿点点!Java并发编程Day1原创 2021-11-25 23:11:13 · 554 阅读 · 0 评论 -
深入剖析大厂经典面试题之ThreadLocal原理(涉及斐波拉契散列、线性探测、扩容以及内存泄露问题)
1、简介ThreadLocal也称线程变量,它是一个以ThreadLocal对象为键、任意对象为值的存储结构(ThreadLocal中ThreadLocalMap的Entry结构),这个结构会被附带在线程上,以此来做线程数据的隔离。ThreadLocal是维持线程的封闭性的一种规范,它提供set()/get()等方法维护和访问线程中存储的私有副本,ThreadLocal通常用于防止对可变的单实例变量或者全局变量进行共享。ThreadLocal和synchronized两者经常会被拿出来一起讨论,虽然二者原创 2021-07-03 18:21:55 · 1022 阅读 · 10 评论 -
Java中各种死锁详细讲述及其解决方案(图文并茂,浅显易懂)
1、简介在遇到线程安全问题的时候,我们会使用加锁机制来确保线程安全,但如果过度地使用加锁,则可能导致锁顺序死锁(Lock-Ordering Deadlock)。或者有的场景我们使用线程池和信号量来限制资源的使用,但这些被限制的行为可能会导致资源死锁(Resource DeadLock)。这是来自Java并发必读佳作 Java Concurrency in Practice 关于活跃性危险中的描述。我们知道Java应用程序不像数据库服务器,能够检测一组事务中死锁的发生,进而选择一个事务去执行;在Java程原创 2021-07-01 22:51:46 · 3812 阅读 · 76 评论 -
java并发之Condition图解与原理剖析
1、Condition定义Condition是一个接口,定义在juc中(java.util.concurrent.locks.Condition),它的主要功能类似于wait()/notify(),但是Condition其实现比wait()/notify()使用更加灵活,简洁、适用场景更加丰富。2、Condition之于Lock与wait()/notify()之于synchronized2.1 wait()/notify()之于synchronizedjava.lang.Object中定义了一原创 2021-06-26 22:46:57 · 1813 阅读 · 27 评论 -
读写锁-ReentrantReadWriteLock源码分析与图解
有经典,有干货,微信搜索【李子捌】关注这个每日推送经典的程序员。为何要有读写锁ReentrantLock锁和其他锁基本上都是排他锁,排他锁指的是在同一时刻只允许一个线程持有锁,访问共享资源。虽然ReentrantLock支持同一个线程重入,但是允许重入的是同一个线程。因此ReentrantReadWriteLock是为了支持多个线程在同一个时刻对于锁的访问孕育而生的。读写锁—简单介绍读写锁ReentrantReadWriteLock允许多个线程在同一时刻对于锁的访问。但是,写线程获取写锁时.原创 2021-06-24 00:08:10 · 488 阅读 · 4 评论 -
详述重入锁-ReentrantLock
有经典,有干货,微信搜索【李子捌】关注这个每日更新的程序员。简介重入锁ReentrantLock指的是支持同一个线程对资源的重复加锁。ReentrantLock中有公平锁和非公平锁的两种实现。synchronizedsynchronized关键字支持隐式的重入;当一个线程获取到锁时,是支持这个线程多次获取这个锁的,不会出现自己阻塞自己的情况,并且我们开发过程中对于synchronized关键字也不需要关心锁的释放。举个递归的例子我们来看synchronized关键字对锁的重入。代码示.原创 2021-06-22 00:47:41 · 521 阅读 · 2 评论 -
AQS(AbstractQueuedSynchronizer)——源码分析
有经典,有干货,微信搜索【李子捌】关注这个每日更新的程序员。简介AbstractQueuedSynchronizer(队列同步器),是用来构建锁或者其他同步组件的基础框架,它通过使用一个int类型的变量来表示同步状态的同时内置FIFO队列来完成资源获取线程的排队工作,AbstractQueuedSynchronizer是大部分同步需求实现的基础。1、Lock接口在学习AbstractQueuedSynchronizer之前,先了解一下Lock接口。了解Lock接口之前呢,先了解一下什么是.原创 2021-06-21 00:15:42 · 456 阅读 · 4 评论 -
线程间之间是如何通信的?
有经典,有干货,微信搜索【李子捌】关注这个傻瓜式坚持的程序员。简介:线程开始运行,拥有自己的栈空间,就会如同一个脚本一样,按照既定的代码一步步的执行,直到终止。但是,如果每个线程之间都是孤立的,那么它们的价值就会很少;反之,如果多个线程能够配合着完成工作,将会带来各方面巨大的收益。1、volatile和synchronized关键字说明:(不做过多说明,需要的话可以看我的往期)Java支持多线程访问一个对象或者对象的成员变量,由于每个线程都拥有这个变量的拷贝(为了执行速度更快),所以程序执.原创 2021-06-16 22:27:57 · 1900 阅读 · 6 评论 -
吐血整理-高级程序员必备Java并发编程原理,没时间看建议收藏
简介:Java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰Java程序员,这一系列几篇文章将揭开Java内存模型的神秘面纱。这一系列的文章大致分4个部分,分别是:Java内存模型基础,主要介绍内存模型相关基本概念Java内存模型中的顺序一致性,主要介绍重排序与顺序一致性内存模型同步原语,主要介绍三个同步原语(synchronized、volatile和final)的内存语义及重排序规则在处理器中的实现Java内存模型的设计,主要介绍Java内存模型的设计原理,及其与处理器内存模型和顺原创 2021-06-14 23:17:25 · 1402 阅读 · 3 评论 -
Java线程基础
简介:线程是操作系统调度的最小单元,在多核环境中,多个线程能同时执行,如果运用得当,能显著的提升程序的性能。一、线程初步认识1、什么是线程操作系统运行一个程序会为其启动一个进程。例如,启动一个Java程序会创建一个Java进程。现代操作系统调度的最小单元是线程,线程也称为轻量级进程(Light Weight Process),一个进程中可以创建一个到多个线程,线程拥有自己的计数器、堆栈和局部变量等属性,并且能访问共享的内存变量。处理器会通过快速切换这些线程,来执行程序。2、Java本身就是原创 2021-06-14 22:18:14 · 2538 阅读 · 8 评论 -
单例模式双重检查锁定与延迟初始化你不得不知道的底层原理
简介在Java多线程中,有时候可能需要采用延迟初始化来降低初始化类和创建对象的开销。双重检查锁(饿汉式单例中经常用)是常见的延迟初始化方案,但它是一个错误的用法。本文将分析双重检查锁定的错误根源,以及两张线程安全的延迟初始化方案。1、双重检查锁定的由来在Java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时,程序员可能会采用延迟初始化。但要争取实现线程安全的延迟化需要一些技巧,以此来避免不必要的问题。非线程安全延迟初始化代码示例:package原创 2021-06-13 01:31:19 · 2972 阅读 · 4 评论 -
Java内存模型之happens-before
简介happens-before是JMM的核心概念。理解happens-before是了解JMM的关键。1、设计意图JMM的设计需要考虑两个方面,分别是程序员角度和编译器、处理器角度:程序员角度,希望内存模型易于理解、易于编程。希望是一个强内存模型。编译器和处理器角度,希望减少对它们的束缚,以至于编译器和处理器可以做更多的性能优化。希望是一个弱内存模型。因此JSR-133专家组设计JMM的核心目标就两个:为程序员提供足够强的内存模型对编译器和处理器的限制尽可能少下面通过原创 2021-06-12 21:44:33 · 1390 阅读 · 6 评论 -
Java面试-final的内存语义
上篇介绍了锁和volatile的内存语义,本文讲述的是final的内存语义,相比之下,final域的读和写更像是普通变量的访问。1、final域的重排序规则final对于final域编译器和处理器遵循两个重排序规则在构造函数内对一个final域的写入,与随后把这个对象的引用赋值给另一个引用变量,这两个操作之间不能重排序初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。读起来相对拗口,用代码来说明上面两种重排序规则:package com.li原创 2021-06-11 23:26:44 · 416 阅读 · 1 评论 -
Java面试-锁的内存语义
简介:锁的作用是让临界区互斥执行。本文阐述所得另一个重要知识点——锁的内存语义。1、锁的释放-获取建立的happens-before关系锁是Java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。锁释放-获取的示例代码:package com.lizba.p1;/** * <p> * 锁示例代码 * </p> * * @Author: Liziba * @Date: 2021/6/10 2原创 2021-06-11 00:32:35 · 361 阅读 · 4 评论 -
Java面试-volatile的内存语义
1、volatile的特性理解volatile特性的一个好办法是把对volatile变量的单个读/写,看成是使用同一个锁对单个读/写操作做了同步。代码示例:package com.lizba.p1;/** * <p> * volatile示例 * </p> * * @Author: Liziba * @Date: 2021/6/9 21:34 */public class VolatileFeatureExample { /** 使用原创 2021-06-10 00:31:10 · 442 阅读 · 3 评论 -
Java面试-内存模型之顺序一致性
简介:顺序一致性内存模型是一个理论参考模型,处理器的内存模型和编程语言的内存模型都会以顺序一致性内存模型作为参照。1、数据竞争和顺序一致性当程序未正确同步时,就可能存在数据竞争。1.1 Java内存模型规范对数据竞争的定义如下在一个线程中写一个变量在另一个线程中读同一个变量写和读没有通过同步来排序如果一个多线程程序能够正确同步,这个程序将是一个没有数据竞争的程序,往往存在数据竞争的程序,运行结果与我们的预期结果都会存在偏差。1.2 JMM对多线程程序的内存一致性做的保证如原创 2021-06-08 23:28:17 · 470 阅读 · 5 评论 -
面试干掉一大片—Java重排序
简介:重排序是指编译器和处理器为了优化性能而对指令序列进行重新排序的一种手段。1、数据依赖性如果两个操作访问同一个变量,而且这两个操作中有一个操作为写操作,此时这两个操作之间存在数据依赖性。数据依赖性分为三种,如表所示:名称代码示例说明写后读a=1;b=a;写一个变量后,再读这个位置写后写a=1;a=2;写一个变量后,在写这个变量读后写a=b;b=1;读一个变量后,再写这个变量上面的这三种情况,只要重排序了两个操作的执行顺序,程序的执行结果就会被改原创 2021-06-07 23:46:58 · 459 阅读 · 3 评论 -
Java内存模型基础
简介:Java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰Java程序员,这一系列几篇文章将揭开Java内存模型的神秘面纱。这一系列的文章大致分4个部分,分别是:Java内存模型基础,主要介绍内存模型相关基本概念Java内存模型中的顺序一致性,主要介绍重排序与顺序一致性内存模型同步原语,主要介绍三个同步原语(synchronized、volatile和final)的内存语义及重排序规则在处理器中的实现Java内存模型的设计,主要介绍Java内存模型的设计原理,及其与处理器内存模型和原创 2021-06-06 23:23:15 · 358 阅读 · 2 评论 -
学习Java并发编程之前你不得不知道的那点事
简介:并发编程的目的是为了让程序运行的更快,但是,并不是启动更多的线程就能让程序最大限度的并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行的更快,会面临非常多的挑战,比如上下文切换的问题、死锁问题,以及受限于硬件和软件的资源限制问题,本篇文章介绍几种并发编程的挑战及解决方案,文章总结至《Java并发编程的艺术》一、上下文切换即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程执行的时间,因为时间片非常短,所有CPU通原创 2021-06-05 01:19:30 · 381 阅读 · 4 评论 -
Java并发编程底层实现原理(不了解这个不敢说懂并发)
写在前面Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM中,JVM执行字节码,最终需要转换为汇编指令在CPU上执行,Java中所有的并发机制依赖于JVM的实现和CPU的指定。1、volatile 的应用在并发编程中synchronized和volatile关键字都扮演着重要的角色,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改了一个共享变量时,另一个线程能读到这个修改的值,如果volatile关原创 2021-06-03 21:33:36 · 445 阅读 · 3 评论 -
Unsafe-Java永远的“神”(二)
我们平时如何实现浅克隆?实现Closeable接口重写close()方法一、Unsafe实现浅克隆浅克隆工具类package com.liziba.unsafe.clone;import com.liziba.unsafe.UnsafeFactory;import sun.misc.Unsafe;import java.lang.reflect.Field;import java.lang.reflect.Modifier;import java.util.Arrays;/*原创 2021-06-02 22:40:37 · 426 阅读 · 0 评论 -
Unsafe-Java永远的“神”(一)
简要介绍:Java语言先比较与C和C++有一个非常大的不同点在于Java语言无法直接操作内存,实际开发中,默认都是由JVM来进行内存分配和垃圾回收,而JVM在进行垃圾回收的时候,绝大多数垃圾回收器都需要STW(stop the world)这个问题往往会导致服务短暂或者较长时间的暂停。因此Unsafe提供了通过Java直接操作内存的API,尽管Unsafe是JavaNIO和并发的核心类,但是其如其名,这是一个官方不推荐开发者使用的及其不安全的类!主要作用:序号作用API1内存管原创 2021-06-02 22:39:47 · 476 阅读 · 0 评论