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