Java并发
文章平均质量分 83
二狗家有矿
这个作者很懒,什么都没留下…
展开
-
面试 ConcurrentHashMap,看这一篇就够了!
本文汇总了常考的 ConcurrentHashMap 面试题,面试 ConcurrentHashMap,看这一篇就够了!为帮助大家高效复习,专门用”★ “表示面试中出现的频率,”★ “越多,代表越高频!实现原理ConcurrentHashMap 的实现原理是什么? ★★★★★ConcurrentHashMap 在 JDK1.7 和 JDK1.8 的实现方式是不同的。先来看下JDK1.7JDK1.7 中的 ConcurrentHashMap 是由Segment数组结...转载 2021-03-29 23:06:05 · 347 阅读 · 0 评论 -
面试官:我问的是Java内存模型,你回答堆栈方法区干嘛?
微信搜《Java鱼仔》真的可以变强!!(一)概述很多人会把Java内存区域(运行时数据区)和Java内存模型(JMM)搞混,这两者是完全不一样的东西。Java内存区域是指JVM运行时数据分区域存储,而Java内存模型是定义了线程和主内存之间的抽象关系,了解Java内存模型是学好Java并发编程的基础。(二)Java内存模型Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。我们...转载 2021-03-11 22:53:08 · 1481 阅读 · 1 评论 -
指令重排序、内存屏障很难?看完这篇你就懂了!
面试官在问到多线程编程的时候,指令重排序、内存屏障经常会被提起。如果你对这两者有一定的理解,那这就是你的加分项。(一)什么是指令重排序为了使处理器内部的运算单元能尽量被充分利用,处理器可能会对输入的代码进行乱序执行优化,处理器会在计算之后将乱序执行的结果重组,并确保这一结果和顺序执行结果是一致的,但是这个过程并不保证各个语句计算的先后顺序和输入代码中的顺序一致。这就是指令重排序。简单来说,就是指你在程序中写的代码,在执行时并不一定按照写的顺序。在Java中,JVM能够根据处理器特性(CPU多转载 2021-03-11 22:50:55 · 119 阅读 · 0 评论 -
深入分析ReentrantLock理解AQS同步队列的细节和设计模式
ReentrantLock介绍ReentrantLock 叫互斥锁也叫可重入锁,ReentrantLock采用内部自己定义的一个抽象静态类Sync 来管理锁,ReentrantLock 内部通过继承Sync抽象静态类,实现了两种锁一种是公平锁,一种是非公平锁,Sync是如何来管理锁,这里就会涉及到AQS的实现原理。重入锁ReentrantlockLock接口先大概看一看Reentrantlock 继承的lock接口 public interface Lock { // 加锁转载 2021-03-11 22:42:19 · 407 阅读 · 0 评论 -
模板设计模式_浅谈AQS与模板设计模式
在Java并发体系中,同步器是绕不开的话题。在顶层的API里无论是ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier等等这些用于线程同步互斥的工具,内部都是用AbstractQueuedSynchronizer(AQS同步器)做为控制。本篇主要介绍如何基于AQS自定义一个锁第一步:定义MyLock实现LockDoug Lea大神在JDK1.5编写了一个Lock接口,里面定义了实现一个锁的基本方法,我们只需编写一个MyLock类实现这个接...转载 2021-03-11 22:32:18 · 265 阅读 · 0 评论 -
ThreadLocal 源码深析及使用示例
首页 博客 程序员学院 下载 论坛 问答 代码 直播 电子书会员中心收藏动态消息11创作中心ThreadLocal 源码深析及使用示例A minor2020-10-01 22:58:2815209收藏4分类专栏:# Java并发源码文章标签:java并发编程面试版权在开始看源码之前,我们必须要知道 ThreadLocal 有什么作用:ThreadLocal 使同一个变量在不同线程间隔离,即每个线程都可以有自己独立的...转载 2021-03-07 00:10:10 · 130 阅读 · 0 评论 -
【JUC源码】线程池:关于 ThreadPool 的几个问题
线程池系列:【JUC源码】线程池:ThreadPoolExecutor(一)继承关系分析 【JUC源码】线程池:ThreadPoolExecutor(二)底层结构分析 【JUC源码】线程池:ThreadPoolExecutor(三)Worker 设计思路及源码分析 【JUC源码】线程池:ThreadPoolExecutor(四) 任务执行流程源码分析 【JUC源码】线程池:ThreadPoolExecutor(五)提炼总结 【JUC源码】线程池:创建线程池的参数设置思路&Exc...转载 2021-03-07 00:09:20 · 84 阅读 · 0 评论 -
【JUC源码】线程池:创建线程池的参数设置思路&Excutors
线程池系列:【JUC源码】线程池:ThreadPoolExecutor(一)继承关系分析 【JUC源码】线程池:ThreadPoolExecutor(二)底层结构分析 【JUC源码】线程池:ThreadPoolExecutor(三)Worker 设计思路及源码分析 【JUC源码】线程池:ThreadPoolExecutor(四) 任务执行流程源码分析 【JUC源码】线程池:ThreadPoolExecutor(五)提炼总结 【JUC源码】线程池:创建线程池的参数设置思路&Exc...转载 2021-03-07 00:09:11 · 279 阅读 · 0 评论 -
【JUC源码】线程池:ThreadPoolExecutor(五)提炼总结
线程池系列:【JUC源码】线程池:ThreadPoolExecutor(一)继承关系分析 【JUC源码】线程池:ThreadPoolExecutor(二)底层结构分析 【JUC源码】线程池:ThreadPoolExecutor(三)Worker 设计思路及源码分析 【JUC源码】线程池:ThreadPoolExecutor(四) 任务执行流程源码分析 【JUC源码】线程池:ThreadPoolExecutor(五)提炼总结 【JUC源码】线程池:创建线程池的参数设置思路&Exc...转载 2021-03-07 00:08:59 · 126 阅读 · 0 评论 -
【JUC源码】线程池:ThreadPoolExecutor(四) 任务执行流程源码分析
线程池系列:【JUC源码】线程池:ThreadPoolExecutor(一)继承关系分析 【JUC源码】线程池:ThreadPoolExecutor(二)底层结构分析 【JUC源码】线程池:ThreadPoolExecutor(三)Worker 设计思路及源码分析 【JUC源码】线程池:ThreadPoolExecutor(四) 任务执行流程源码分析 【JUC源码】线程池:ThreadPoolExecutor(五)提炼总结 【JUC源码】线程池:创建线程池的参数设置思路&Exc...转载 2021-03-06 00:20:51 · 196 阅读 · 0 评论 -
【JUC源码】线程池:ThreadPoolExecutor(三)Worker 设计及源码分析
线程池系列:【JUC源码】线程池:ThreadPoolExecutor(一)继承关系分析 【JUC源码】线程池:ThreadPoolExecutor(二)底层结构分析 【JUC源码】线程池:ThreadPoolExecutor(三)Worker 设计思路及源码分析 【JUC源码】线程池:ThreadPoolExecutor(四) 任务执行流程源码分析 【JUC源码】线程池:ThreadPoolExecutor(五)提炼总结 【JUC源码】线程池:创建线程池的参数设置思路&Exc...转载 2021-03-06 00:19:08 · 146 阅读 · 0 评论 -
【JUC源码】线程池:ThreadPoolExecutor(二)底层结构分析
线程池系列:【JUC源码】线程池:ThreadPoolExecutor(一)继承关系分析 【JUC源码】线程池:ThreadPoolExecutor(二)底层结构分析 【JUC源码】线程池:ThreadPoolExecutor(三)Worker 设计思路及源码分析 【JUC源码】线程池:ThreadPoolExecutor(四) 任务执行流程源码分析 【JUC源码】线程池:ThreadPoolExecutor(五)提炼总结 【JUC源码】线程池:创建线程池的参数设置思路&Exc...转载 2021-03-06 00:17:42 · 117 阅读 · 0 评论 -
【JUC源码】线程池:ThreadPoolExecutor(一)继承关系分析
线程池系列:【JUC源码】线程池:ThreadPoolExecutor(一)继承关系分析 【JUC源码】线程池:ThreadPoolExecutor(二)底层结构分析 【JUC源码】线程池:ThreadPoolExecutor(三)Worker 设计思路及源码分析 【JUC源码】线程池:ThreadPoolExecutor(四) 任务执行流程源码分析 【JUC源码】线程池:ThreadPoolExecutor(五)提炼总结 【JUC源码】线程池:创建线程池的参数设置思路&Exc...转载 2021-03-06 00:16:22 · 259 阅读 · 0 评论 -
【JUC源码】线程池:ThreadPoolExecutor 万字源码深析(超详细注释)
在文章开始之前,我们先要明白为啥要有线程池这么个东西。线程是一种稀缺资源,若不加以限制,不仅会占用大量资源,还会影响系统的稳定性。而线程池可以对线程的创建与停止、线程数量等等因素加以控制,使得线程在一种可控的范围内运行,在保证系统稳定运行的同时,还使得性能调优更加方便。另外,每次请求到来时,由于线程的创建已经完成,所以可以直接执行任务,减少了每次创建线程、销毁线程的开销,提高了响应速度。OK,下面我们就进入正戏,源码…PS:本文篇幅较长,对于看着感觉费劲的同学,这里还提供了拆分的版本:【JUC转载 2021-03-06 00:15:05 · 229 阅读 · 0 评论 -
【JUC源码】并发容器:关于 ConcurrentHashMap 的几个问题
ConcurrentHashMap 系列:【JUC源码】并发容器:ConcurrentHashMap(一)底层结构分析 【JUC源码】并发容器:ConcurrentHashMap(二)添加元素及树化源码分析 【JUC源码】并发容器:ConcurrentHashMap(三)扩容源码分析 【JUC源码】并发容器:ConcurrentHashMap(四)获取 value 源码分析 【JUC源码】并发容器:关于 ConcurrentHashMap 的几个问题在下面有什么不理解的地方,可以参...转载 2021-03-06 00:12:10 · 110 阅读 · 0 评论 -
【JUC源码】并发容器:ConcurrentHashMap(四)获取 value 源码分析
ConcurrentHashMap 系列:【JUC源码】并发容器:ConcurrentHashMap(一)底层结构分析 【JUC源码】并发容器:ConcurrentHashMap(二)添加元素及树化源码分析 【JUC源码】并发容器:ConcurrentHashMap(三)扩容源码分析 【JUC源码】并发容器:ConcurrentHashMap(四)获取 value 源码分析 【JUC源码】并发容器:关于 ConcurrentHashMap 的几个问题get()Concurren...转载 2021-03-06 00:11:10 · 376 阅读 · 0 评论 -
【JUC源码】并发容器:ConcurrentHashMap(三)扩容源码分析
ConcurrentHashMap 系列:【JUC源码】并发容器:ConcurrentHashMap(一)底层结构分析 【JUC源码】并发容器:ConcurrentHashMap(二)添加元素及树化源码分析 【JUC源码】并发容器:ConcurrentHashMap(三)扩容源码分析 【JUC源码】并发容器:ConcurrentHashMap(四)获取 value 源码分析 【JUC源码】并发容器:关于 ConcurrentHashMap 的几个问题1.扩容校验:addCount(...转载 2021-03-06 00:10:05 · 178 阅读 · 0 评论 -
【JUC源码】并发容器:ConcurrentHashMap(二)添加元素及树化源码分析
ConcurrentHashMap 系列:【JUC源码】并发容器:ConcurrentHashMap(一)底层结构分析 【JUC源码】并发容器:ConcurrentHashMap(二)添加元素及树化源码分析 【JUC源码】并发容器:ConcurrentHashMap(三)扩容源码分析 【JUC源码】并发容器:ConcurrentHashMap(四)获取 value 源码分析 【JUC源码】并发容器:关于 ConcurrentHashMap 的几个问题由于 concurrentHas...转载 2021-03-06 00:08:22 · 305 阅读 · 0 评论 -
【JUC源码】并发容器:ConcurrentHashMap(一)底层结构分析
ConcurrentHashMap 系列:【JUC源码】并发容器:ConcurrentHashMap(一)底层结构分析 【JUC源码】并发容器:ConcurrentHashMap(二)添加元素及树化源码分析 【JUC源码】并发容器:ConcurrentHashMap(三)扩容源码分析 【JUC源码】并发容器:ConcurrentHashMap(四)获取 value 源码分析 【JUC源码】并发容器:关于 ConcurrentHashMap 的几个问题我们从类注释上大概可以得到如下信...转载 2021-03-06 00:06:51 · 133 阅读 · 0 评论 -
【JUC源码】JUC核心:关于AQS的几个问题
AQS 系列:【JUC源码】JUC核心:AQS(一)底层结构分析 【JUC源码】JUC核心:AQS(二)同步队列源码分析(独占锁) 【JUC源码】JUC核心:AQS(三)同步队列源码分析(共享锁) 【JUC源码】JUC核心:AQS(四)条件队列源码分析 【JUC源码】JUC核心:关于AQS的几个问题1.说说你对 AQS 的理解?答:回答的方向是由大到小,由全到细,由使用到原理。AQS 是一个锁框架,它定义了锁的实现机制,并开放出扩展的地方,让子类去实现,比如我们在 lock...转载 2021-03-05 00:16:07 · 199 阅读 · 1 评论 -
【JUC源码】JUC核心:AQS(四)条件队列源码分析
AQS 系列:【JUC源码】JUC核心:AQS(一)底层结构分析 【JUC源码】JUC核心:AQS(二)同步队列源码分析(独占锁) 【JUC源码】JUC核心:AQS(三)同步队列源码分析(共享锁) 【JUC源码】JUC核心:AQS(四)条件队列源码分析 【JUC源码】JUC核心:关于AQS的几个问题条件队列: 作用 实现类似 synchronized 的 wait 与 signal,实现在使用锁时对线程管理 而且由于实现了 Condition,对线程的管理可以更加细化...转载 2021-03-05 00:15:05 · 186 阅读 · 1 评论 -
【JUC源码】JUC核心:AQS(三)同步队列源码分析(共享锁)
AQS 系列:【JUC源码】JUC核心:AQS(一)底层结构分析 【JUC源码】JUC核心:AQS(二)同步队列源码分析(独占锁) 【JUC源码】JUC核心:AQS(三)同步队列源码分析(共享锁) 【JUC源码】JUC核心:AQS(四)条件队列源码分析 【JUC源码】JUC核心:关于AQS的几个问题1.共享-加锁共享锁和排他锁最大的不同在于:对于同一个共享资源,排他锁只能让一个线程获得,而共享锁还会去唤醒自己的后续节点,一起来获得该锁acquireShared()共享模...转载 2021-03-05 00:13:13 · 106 阅读 · 1 评论 -
【JUC源码】JUC核心:AQS(二)同步队列源码分析(独占锁)
AQS 系列:【JUC源码】JUC核心:AQS(一)底层结构分析 【JUC源码】JUC核心:AQS(二)同步队列源码分析(独占锁) 【JUC源码】JUC核心:AQS(三)同步队列源码分析(共享锁) 【JUC源码】JUC核心:AQS(四)条件队列源码分析 【JUC源码】JUC核心:关于AQS的几个问题同步队列:作用:管理多个线程的休眠与唤醒 策略:可以执行的线程 = RUNNABLE 状态 && tryAcquire() 成功 独占模式(EXCLUSIVE):...转载 2021-03-05 00:11:28 · 205 阅读 · 1 评论 -
【JUC源码】JUC核心:AQS(一)底层结构分析
AQS 系列:【JUC源码】JUC核心:AQS(一)底层结构分析 【JUC源码】JUC核心:AQS(二)同步队列源码分析(独占锁) 【JUC源码】JUC核心:AQS(三)同步队列源码分析(共享锁) 【JUC源码】JUC核心:AQS(四)条件队列源码分析 【JUC源码】JUC核心:关于AQS的几个问题首先,从类注释可以得到的信息:提供了一种框架,自定义了先进先出的同步队列,让获取不到锁的线程能进入同步队列中排队; 同步器有个状态字段,我们可以通过状态字段来判断能否得到锁,此时设...转载 2021-03-05 00:08:43 · 125 阅读 · 1 评论 -
【Java并发编程】操作系统基础(五):Java 线程模型、线程调度算法
1 Java 线程模型Java 语言的线程,从规范的角度来说是不强制要求任何具体的实现方式的。采用1:1、N:1、M:N模型都可以。先放个传送门:RednaxelaFX:JVM中的线程模型是用户级的么?N : 1(JDK2前)Java线程在JDK1.2之前,是基于称为“绿色线程”(Green Threads)的用户线程实现的,而在JDK1.2中,线程模型替换为基于操作系统原生线程模型来实现。因此,在目前的JDK版本中,操作系统支持怎样的线程模型,在很大程度上决定了Java虚拟机的线程是怎样映射的转载 2021-03-05 00:06:28 · 204 阅读 · 1 评论 -
【Java并发编程】操作系统基础(四):进程调度时机、模式、算法
1.调度时机在创建一个新进程之后,需要决定是运行父进程还是运行子进程。由于这两种进程都处于就绪状态,所以这是一种正常的调度决策,可以任意决定。 在一个进程退出时必须做出调度决策。一个进程不再运行,所以必须从就绪进程集中选择另外某个进程。如果没有就绪的进程,通常会运行一个系统提供的空闲进程。 当一个进程在阻塞I/O和信号量上或由于其他原因阻塞时,必须选择另一个进程运行。 在一个I/O中断发生时,必须做出调度决策。如果中断来自I/O设备,而该设备现在完成了工作,某些阻塞的等待该I/O进程就成为可运行的转载 2021-03-05 00:06:15 · 479 阅读 · 1 评论 -
【Java并发编程】操作系统基础(三):上下文切换的三种情况
我们都知道,Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉。而在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好CPU 寄存器和程序计数器什么是 CPU 上下文?CPU 寄存器和程序计数器就是 CPU 上下文,因为它们都是 CPU 在运行任何任务前,必须的依赖环境。CPU 寄存器是 CPU转载 2021-03-05 00:06:02 · 656 阅读 · 1 评论 -
【Java并发编程】操作系统基础(二):内核态、用户态
Linux & Unix架构图:从图上我们可以看出来通过系统调用将 Linux 整个体系分为用户态和内核态(或者说内核空间和用户空间)。系统调用 为了使应用程序访问到内核管理的资源例如 CPU,内存,I/O。内核必须提供一组通用的访问接口,这些接口就叫系统调用。例如:用户态想要申请一块20K大小的动态内存,就需要brk系统调用,将数据段指针向下偏移,如果用户态多处申请20K动态内存,同时又释放呢?这个内存的管理就变得非常的复杂。 Shell 顾名思义,就是外壳的意思。就好像把内核包裹起来转载 2021-03-05 00:05:50 · 212 阅读 · 1 评论 -
【Java并发编程】操作系统基础(一):进程、线程、线程模型
1.进程与线程1.1 进程资源分配单位。创建慢,上下文切换开销大进程状态:从上图可以看出,进程运行中只有三种状态:ready,running,waiting 事实上还存在进程挂起状态,原因是为了满足 CPU 的某些需求,会将一些处于阻塞/就绪的进出交换出内存,等到需要时再激活。而就绪态和阻塞态的进程都白白占用着内存,因此挂起态又可分为就绪挂起和阻塞挂起。详细可以参考这篇博客。1.2 线程(轻量级进程)CPU 调度单位。线程间共享进程资源。在 Linux 下其实本并没有线程,只转载 2021-03-05 00:05:38 · 201 阅读 · 1 评论 -
【Java并发编程】并发:线程安全三要素及解决方案
1.可见性多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看到修改的值。解决方案1)JMM 提供了 volatile2.有序性若在本线程内观察,所有操作是有有序的 若在一个线程观察另一个线程,所有操作时无序的 在 JVM 中,为了效率允许编译器和处理器对指令进行重排序解决方案1)线程内:as-if-seria,单线程中重排序后不影响执行结果2)多线程:JMM 提供了happens-before规则程序顺序规则:一个线程中的每个操作,happen..转载 2021-03-04 00:19:02 · 207 阅读 · 1 评论 -
【Java并发编程】Java多线程(五):关于线程的几个问题
1.子线程 1 去等待子线程 2 执行完成之后才能执行,如何去实现?答:这里考察的就是 Thread.join 方法,我们可以这么做:@Testpublic void testJoin2() throws Exception { // 线程2 Thread thread2 = new Thread(new Runnable() { public void run() {...} }); // 线程1 Thread thread1 = new Thread(new Ru转载 2021-03-04 00:17:56 · 61 阅读 · 1 评论 -
【Java并发编程】Java多线程(四):FutureTask 源码分析
前言:【Java并发编程】Java多线程(三):Runnable、Callable --创建任务的方式在上一篇文章的末尾我们通过两个问题,引出了 FutureTask 及其设计思路,先来回顾一下:问题一:Callable 与 Future都是接口,怎么实现通过 Future 控制 Callable 呢?答:可以创建一个中间类实现 Future接口,然后将 Callable 实例组合进来,最后通过 Future 接口中的方法实现控制。问题二:另外,这里还要考虑一个问题,Runnable 和 C转载 2021-03-04 00:16:36 · 162 阅读 · 1 评论 -
【Java并发编程】Java多线程(三):创建任务 --Runnable、Callable
1.创建线程任务方式一:RunnableRunnable#run() 实现线程逻辑, 无返回值public interface Runnable { public abstract void run();}2.创建线程任务方式一:Callable2.1 CallableCallable#call() 实现线程逻辑,有返回值(V)public interface Callable<V> { V call() throws Exception;}转载 2021-03-04 00:14:37 · 100 阅读 · 1 评论 -
【Java并发编程】Java多线程(二):多线程一定好吗?线程阻塞时占用CPU吗?
1.多线程一定好吗?1.1 多线程优势1)阻塞等待时充分利用 CPU当程序发生阻塞的操作时候,例如IO等待,CPU将就空闲下来了。而使用多线程,当一些线程发生阻塞的时候,另一些线程则仍能利用CPU,而不至于让CPU一直空闲。2)利用 CPU 的多核并行计算能力现在的CPU基本上都是多核的。使用多线程,可以利用多核同时执行多个线程,而不至于单线程时一个核心满载,而其他核心空闲。1.2 多线程弊端1)线程切换是有开销的,这会导致程序运行变慢。2)多线程程序必须非常小心地同步代码,转载 2021-03-04 00:13:19 · 1733 阅读 · 1 评论 -
【Java并发编程】Java多线程(一):线程基础
1.线程介绍1.1 线程状态NEW(创建):线程刚被创建,但未启动,还未调用start RUNNABLE(可运行):调用了 strat 方法;可能在 CPU 执行,也有可能没有 TIMED_WAITING(计时等待):让出 CPU,计时休眠;sleep(持锁) WAITINIT(等待):让出 CPU,休眠;无锁 park->unpark,有锁 wait->notify(会释放锁) BLOCKED(阻塞):等待获得 monitor lock 锁,是对于 synchronized 而转载 2021-03-04 00:11:23 · 120 阅读 · 0 评论 -
【Java并发编程】synchronized 与 Reentrantlock 对比
多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言。核心类库包含一个Thread类,可以用它来构建、启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 ——synchronized和volatile。在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使它变得更容易了。1.简单回顾1.1 synchronized把代码块声明为 synchronized,...转载 2021-03-04 00:08:02 · 116 阅读 · 0 评论 -
【Java并发编程】Reentrantlock(二):生产者消费者问题
在讲 synchronized 时候,我们使用 synchronized 实现了生产者消费者问题,本篇我们再使用 Lock 和 Condition 来实现。【Java并发编程】synchronized(一):生产者消费者问题对比两种方式,Condition 的方式可以更加精确的指定哪些线程被唤醒public class MyContainer03<T> { // 容器 LinkedList<T> list = new LinkedList<&g...转载 2021-03-04 00:07:50 · 178 阅读 · 0 评论 -
【Java并发编程】Reentrantlock(一):基本使用及特性方法
1.Reentrantlock 基本使用reentrantlock 用于替代 synchronized,需要注意的是,必须要必须要必须要手动释放锁(重要的事情说三遍)PS:使用syn锁定的话如果遇到异常,jvm会自动释放锁,但是lock必须手动释放锁,因此经常在finally中进行锁的释放public class ReentrantLock1 { ReentrantLock lock = new ReentrantLock(); void m1(){ ...转载 2021-03-04 00:07:39 · 141 阅读 · 0 评论 -
【Java并发编程】synchronized(七):优化方案(锁消除、锁粗化)
synchronized 最大的优化莫过于在 JDK6 时引入了 偏向锁”和“轻量级锁”,从而锁级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,大幅提升了性能,具体过程可以参考【Java并发编程】synchronized(二):重量级锁原理分析(JDK6前) 【Java并发编程】synchronized (三):锁膨胀原理分析(JDK6后)本篇文章我们就来看看我们自己在编写代码时,有什么优化锁性能的方案1.锁消除锁消除即删除不必要的加锁操作。虚拟机即时编辑器在转载 2021-03-04 00:07:23 · 280 阅读 · 0 评论 -
【Java并发编程】synchronized(六):锁膨胀原理分析(JDK6后)
前言:【Java并发编程】synchronized(二):重量级锁原理分析(JDK6前)JDK6 为了减少获得锁和释放锁带来的性能消耗,引入了 “偏向锁” 和 “轻量级锁”:锁一共有 4 种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。锁可以升级但不能降级。在对象头的 Mark Word 中保存了不同的锁状态:偏向锁:加锁信息。通过修改 ThreadId 来实现加锁 轻量级锁:指针,指向拿锁线程的 Lock Record(里面保存了对象的 MarkW...转载 2021-03-03 00:20:30 · 142 阅读 · 0 评论