lock
关于锁的问题
L_J_X03
这个作者很懒,什么都没留下…
展开
-
AQS源码解读
以ReentrantLock进行AQS讲解 ReentrantLock有个Sync内部类继承AQS接口。ReentrantLock的公平锁与非公平锁都是继承Sync ReentrantLock的加锁的三个步骤: 1.尝试加锁 2.加锁失败后,线程进入队列。 3.加入队列只会,进入阻塞状态。 ...原创 2021-05-26 11:25:36 · 139 阅读 · 1 评论 -
AQS体系
AQS:通常指的是AbstractQueuedSynchronizer(但是它们三是相互关联的关系)—抽象的队列同步器 与LockSupport相关的锁有:ReentrantLock,ReenTrantReadWriteLock,CountDownLatch.SemaPhone等相关。 脑图: 锁:面向锁的使用者 同步器:面向锁的实现者 将抢占资源的线程封装成一个node节点 使用一个valatile修饰的变量(state)来表示同步状态 state状态等于0表示现在没有线程在等待,可.原创 2021-05-25 09:38:14 · 150 阅读 · 0 评论 -
LockSupport
在java.util.concurrent.locks包下 使用java在线API: https://www.matools.com/api/java8 LockSupport是线程的wait/notify的改良加强版 LOckSupport的park和unpark的作用分别是阻塞线程与解除阻塞线程的事 三种线程的等待/唤醒方法 1.Object对象的wait方法使线程等待,notify方法唤醒线程 注意:不在同一个代码块等待和唤醒功能是不能被用的,会报异常 注意:要等待在前,唤醒在后。如果唤醒在前。等待在原创 2021-05-24 13:32:03 · 85 阅读 · 0 评论 -
可重入锁
可重入锁: 同一个线程在外层方法里面获取了锁,在进入内层方法的时候会自动获取锁,不会因为之前获取锁还没有释放而阻塞。 ReentrantLock与synchronized都是可重入锁,可在一定程度上避免死锁。 隐式锁(即使用Synchronized的锁):synchronized默认是可重入锁,synchronized分为同步代码块和同步方法 显式锁(Lock):也有Reentrant这样的可重入锁 实例1–synchronized之同步代码块 package com.example.demo.LockTe原创 2021-05-23 14:56:40 · 110 阅读 · 0 评论 -
并发问题的死锁编码及定位分析
死锁的原因: 查看是否死锁 #查看进程编号 jps -l #查看进程运行状况 jstack 进程编号原创 2021-05-09 14:13:38 · 71 阅读 · 0 评论 -
Synchronized与Lock的区别,新的Lock与以前有什么好处
synchronized属于jvm层面,属于java的关键字 Lock是java的API层面的锁,在java.util.concurrent.locks.lock 1.原始构成 synchronized: monitorenter(底层是通过monitor对象来完成,wait/notify方法都是通过monitor对象来完成,只有在同步代码快里面才能使用wait/notify等方法) monitorexit Lock:是具体类 2.使用方法 synchronized不需要手动释放,当线程执行完成之后,系统会原创 2021-05-06 15:23:29 · 67 阅读 · 0 评论 -
公平锁和非公平锁
java.util.concurrent.locks.ReentrantLock 公平:按顺序 非公平:中途可以加东西 默认是非公平锁,但是如果构建的时候传入true则是公平锁 非公平与公平锁的优点在于: 非公平的吞吐量高 吞吐量:JVM中,执行用户代码的时间/总时间 吞吐量越大,系统越好 synchronized相当于非公平锁 ...原创 2021-04-28 13:10:31 · 71 阅读 · 0 评论 -
可重入锁(递归锁)
可重入锁(递归锁):指的是同一个线程外层函数获取锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程的外层方法获取锁的时候,在内层方法会自动获取锁。 ReentrantLock与synchronized都是可重入锁 可重入锁很大程度上避免死锁 注意: 加了几把锁就要解除几把锁 ...原创 2021-04-28 21:58:51 · 101 阅读 · 0 评论 -
自旋锁(理论,代码,小总结)
自旋锁指获取锁的线程不会立即阻塞,而是采用循环的方法去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是消耗CPU 自旋锁的好处是:线程不会阻塞 自旋锁的坏处是:如果长时间不能获得锁,循环重了后,性能会下降 手写自旋锁 /** * 手写自旋锁 */ public class SpinLock { //创建原子引用类型为Thread的对象 AtomicReference<Thread> threadAtomicReference = new AtomicReferenc原创 2021-04-28 22:48:10 · 151 阅读 · 0 评论 -
独占锁(写锁)/共享锁(读锁)/互斥锁
独占锁:指该锁一次只能被一个线程所持有,ReentrantLock和Synchronized都是独占锁 共享锁:指该锁可被多个线程所持有 对ReentrantReadWriteLock的读锁的共享锁,其写锁是独占锁。 读锁的共享锁可保证并发读是非常高效的,读写,写读,写写时互斥的 注意: 在高内聚低耦合的情况下,都是线程操作资源类 ReentrantLock与ReentrantReadWriteLock都是能进行加锁,但是ReentrantLock只能允许一个线程进行操作,ReentrantReadWr原创 2021-04-29 22:09:53 · 275 阅读 · 0 评论 -
countDownLatch
countDownLatch线程只有当线程满足当前的几个条件之后,才能被唤醒线程,继续执行 countDownLatch实例 package com.example.demo.Test; import java.util.concurrent.CountDownLatch; public class CountDownLatchTest { public static void main(String[] args) throws InterruptedException {原创 2021-04-30 13:41:50 · 61 阅读 · 0 评论 -
cyclicBarrier
cyclicBarrier与countDownLatch相反 countDownLatch是从初始值减到0 cyclicBarrier是从0加到初始值 cyclicBarrier先到的线程先进行等待,只有达到parties的个数,就可以执行构造的方法 构造器: 1.public CyclicBarrier(int parties, Runnable barrierAction) public CyclicBarrier(int parties, () ->{ System.out.println(原创 2021-04-30 14:06:33 · 126 阅读 · 0 评论 -
semaphone
semaphone是能够复用的,当信号量不为0的时候,其他线程可以继续使用 默认非公平锁 semaphone测试 package com.example.demo.Test; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; /** * 关于SemaPhone的测试类 * 通过信号量进行操作 */ public class SemaphoneTest { public static原创 2021-04-30 14:32:50 · 285 阅读 · 0 评论