并发编程
介绍锁的实现原理以及常见使用的java并发类
叶小希
帅就完事了~
展开
-
邮戳锁StampLock
基本理论所有获取锁的方法,都返回一个邮戳(Stamp),Stamp为0表示获取失败,其余都表示成功; 所有释放锁的方法,都需要一个邮戳(Stamp),这个Stamp必须是和成功获取锁时得到的Stamp一致; StampedLock是不可重入的;(如果一个线程已经持有了写锁,再去获取写锁的话就会造成死锁) StampedLock有三种访问模式: Reading(读模式):功能和ReentrantReadWriteLock的读锁类似 Writing(写模式):功能和ReentrantReadWr原创 2021-11-25 14:40:56 · 1313 阅读 · 0 评论 -
读写锁ReentrantReadWriteLock
AQS实现的工具类,需要明白的就是AQS的state代表的是什么。ReentrantLockReadWriteLock中的state同时表示写锁和读锁的个数。为了实现这种功能,state的高16位表示读锁的个数,低16位表示写锁的个数。AQS有两种模式:共享模式和独占模式,读写锁的实现中,读锁使用共享模式;写锁使用独占模式;另外一点需要记住的即使,当有读锁时,写锁就不能获得;而当有写锁时,除了获得写锁的这个线程可以获得读锁外,其他线程不能获得读锁。读锁,就是加锁的时候看头节点是不是读模式(共享模式)..原创 2021-11-24 16:58:12 · 127 阅读 · 0 评论 -
Future的get方法靠什么机制来阻塞
future底层其实也是AQS实现的阻塞,利用一个可见的state+cas+队列实现的看一下future子类FutureTask的实现private int awaitDone(boolean timed, long nanos) throws InterruptedException { final long deadline = timed ? System.nanoTime() + nanos : 0L; WaitNode q = null;.原创 2021-11-07 10:57:02 · 1213 阅读 · 0 评论 -
线程池解析
1、线程池构造 public ThreadPoolExecutor(int corePoolSize, // 核心线程数 int maximumPoolSize,// 最大线程数 // 超过一段时间没运行的线程会被回收, // 如果配置了核心线程可以被回收,核心线程也可以被回收原创 2021-11-07 00:03:47 · 114 阅读 · 0 评论 -
线程中断解析
线程中断相关方法介绍及区别1、interruptinterrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常,并且会清理掉线程的中断状态,抛出异常说明当前线程阻塞的代码已经被中断,不需要继续保持中断状态了。2、i.原创 2021-11-06 18:22:20 · 142 阅读 · 0 评论 -
常见的锁机制及案列使用(synchronized)
Java中为了保证线程的并发,实现了很多锁相关概念锁重入: 在已经获得锁的同步方法或同步代码块内部可以调用锁定对象的其他同步方法, 不需要重新获取锁。synchronized修饰类的时候和修饰静态方法是一样的,都是给所有的对象加了同一把锁;修饰实例方法时作用范围就是整个函数,给当前实例加锁;修饰代码块时作用范围就是大括号内的内容,对给定的对象加锁。代表任意时候最多只有一个线程能够进入到同步块(同步方法)。当一个类中有多个同步块(同步方法)时,也只有一个线程能够执行这多个同步块(同步.原创 2020-06-06 15:16:12 · 178 阅读 · 0 评论 -
多线程---ThreadLocal
ThreadLocal类可以理解为线程本地变量。每个线程往这个ThreadLocal中读写是线程隔离,互相之间不会影响的。通过让每个线程有自己的独立副本从而实现线程封闭的机制。每个线程有一个自己的ThreadLocalMap。底层是一个数组实现的。每个线程在往某个ThreadLocal里塞值的时候,都会往自己的ThreadLocalMap里存,读也是以某个ThreadLocal作为引用,在自己的map里找对应的key,从而实现了线程隔离。存储结构解析 static class Entr原创 2020-11-03 19:59:17 · 185 阅读 · 0 评论 -
Java基础---synchronized锁
synchronized锁原创 2020-11-09 11:12:50 · 101 阅读 · 0 评论 -
Java基础---Lock锁底层AQS解析
Lock锁相比于关键字synchronized更加灵活,Lock锁底层是基于AQS(同步队列)实现的。AQS是基于volatile和cas操作实现的。独占锁ReentrantLock获取锁流程ReentrantLock的lock()就是调用内部AQS的lock方法。内部的AQS有两种实现,一种为公平锁,一种非公平。AQS lock方法 final void lock() { // 非公平锁会先抢一次锁,失败后调用acquire,公平锁直接调用acquire原创 2020-11-16 11:51:00 · 708 阅读 · 0 评论 -
常见的锁机制及案列使用(util.concurrent)
CountDownLatch 闭锁是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。package study;import java.util.concurrent.CountDownLatch;public class CountDownLatchTest { public static void main(String[] args) {原创 2020-06-09 09:58:45 · 175 阅读 · 0 评论 -
lock锁的中断响应和超时响应实现
import java.util.concurrent.locks.ReentrantLock;public class MainBoot { public static void main(String[] args) throws Exception { ReentrantLock lock = new ReentrantLock(); lock.lock(); Thread t = new Thread(new A(lock)); .原创 2021-10-31 13:59:21 · 1134 阅读 · 0 评论