
线程&锁
文章平均质量分 85
线程&锁
MrFC
这个作者很懒,什么都没留下…
展开
-
ThreadLocal源码解析
ThreadLocal是什么?在Java体系中有一个ThreadLocal类,它用于提供线程内部的局部变量,这些变量与它们的正常对象不同,每个线程拥有一个单独属于自己的,独立的变量的初始副本。简单来说,通过ThreadLocal可以实现多线程中数据隔离效果。ThreadLocal如何使用?通过ThreadLocal的简单使用,来验证数据隔离效果:public class Main { public static void main(String[] args) {原创 2021-03-24 10:11:38 · 1489 阅读 · 1 评论 -
AbstractQueuedSynchronizer(AQS)源码分析——Condition条件队列
Condition条件队列是为了实现线程之间相互等待的问题。注意Condition对象只能在独占锁中才能使用。举个例子:有两个线程,生产者线程,消费者线程。当消费者线程消费产品时,发现没有产品,这时它就要等待,让生产者线程生产产品出来后,再通知它消费。同样的,当生产者线程生产产品时,发现存储产品的仓库(列表)容量已经满了,这时它就要等待,让消费者消费产品后,再通知它生产产品。因为操作的是同一个资源,所以要加锁,防止多线程冲突。而锁在同一时间只能有一个线程持有,所以消费者/生产者在让线程等待前,必须释放原创 2021-03-16 10:21:39 · 1664 阅读 · 1 评论 -
AbstractQueuedSynchronizer(AQS)源码分析——共享锁(ReentrantReadWriteLock)
Java中的AQS实现了多线程中很重要的两套机制——独占锁和共享锁。在此文中只针对共享锁的源码进行讲解分析。如果想了解独占锁的朋友可以看我的另外一篇博文:https://blog.youkuaiyun.com/weixin_41083377/article/details/114753584共享锁是什么?简单来说,共享锁可以被多个线程共同持有。在Java中最经典的实现就是ReentrantReadWriteLock(读写锁)。在读写锁中有两个锁对象,一个是读锁,另一个是写锁。读锁属于共享锁,可以让多个线程同时原创 2021-03-15 17:24:35 · 1564 阅读 · 1 评论 -
AbstractQueuedSynchronizer(AQS)源码分析——独占锁(ReentrantLock)
AQS是什么?AQS是Java中实现阻塞和唤醒线程的最基础类。全称 AbstractQueuedSynchronizer(同步队列),它是一个同步工具也是 Lock 用来实现线程同步的核心组件。而其中也是基于CAS原理比较替换实现添加和移除结点。从使用层面来说,AQS 的功能分为两种:独占锁:每次只能有一个线程持有锁,比如ReentrantLock就是以独占方式实现的互斥锁。共享锁:允许多个线程同时获取锁,并发访问共享资源,比如ReentrantReadWriteLock读写锁PS:本原创 2021-03-13 20:33:35 · 1592 阅读 · 0 评论 -
ReentrantLock锁的可重入原理以及源码分析
了解Java中ReentrantLock可重入锁的人都知道可重入的原理:针对于同一线程而言,其中执行的嵌套同步方法只需获取一次锁,便可执行到底。来个例子说明:在t线程中有两个同步方法A、B,而方法A中,调用了方法B。那么执行方法A的时候便获取到了锁对象,当执行到方法B中需要获取锁的时候,因为方法A、B处于同一个线程当中,而且使用的是可重入锁机制,所以方法B无须再次获取锁便可以继续执行之后的代码。如果采用的是不可重入锁机制,那么当执行到方法B时候,就会和方法A争抢锁,而锁已被方法A获取。方法A当中需原创 2021-03-13 11:06:16 · 1976 阅读 · 2 评论 -
详解Java线程中的join()方法
对于Java中的join()方法的描述,我们首先来看下源码当中的解释从源码当中的描述,我们只能知道join方法的作用是让线程陷入等待。其中可以传递以毫秒为单位的等待时间参数,如果传递参数为0,则线程会一直等待。其实对于join方法,网上有很多解释,大都是只说如何使用,并没有对join当中的实现进行分析。因此,在此结合网上的各种说法,对线程中的join方法进行源码分析,同时也记录自己的学习过程。首先先来了解join方法如何使用,以及它的作用。为了更有对比性的展示,首先来个简单并正常使用(不使原创 2021-03-09 20:55:46 · 4976 阅读 · 13 评论