我们继续接上篇,本篇是对unlock方法的跟踪解析。 调用lock.unlock(); 进入后发现,还是使用了sync对象的方法,上篇中以及说明了,sync实际上是对于AQS的一种实现,实现一部分AQS提供的抽象方法。 我们进入release方法看看 我们能看到,进入后,传递的参数是一,这个是加锁的 ...
分类:
其他好文 时间:
2020-07-26 16:04:56
阅读次数:
80
可重入锁 可重锁是指同一个线程,外层函数获取锁后,内层函数可以自动获取到锁。 java中synchronized和ReentrantLock都是可重入锁。 对于synchronized,其实现机制有jvm实现。 对于ReentrantLock,其继承自父类AQS,其父类AQS中维护了一个同步状态st ...
分类:
编程语言 时间:
2020-07-23 22:39:26
阅读次数:
64
公平和非公平锁 公平锁:是指多个线程按照申请锁的顺序来获取锁,类似排队,先来后到。 非公平锁:是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁在高并发的情况下,有可能会造成优先级反转或者饥饿现象。 两者区别: 并发包中ReentrantLock的创建可以指定 ...
分类:
其他好文 时间:
2020-07-21 09:46:12
阅读次数:
82
Semaphore Semaphore 字面意思是信号量的意思,它的作用是控制访问特定资源的线程数目。应用场景:资源访问,服务限流。 Semaphore 实现AbstractQueuedSynchronizer的方法与ReentrantLock一样 Semaphore构造方法 public Sema ...
分类:
其他好文 时间:
2020-07-18 22:55:40
阅读次数:
108
Java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchronized还是存在一些缺陷的:虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基于JVM机制), ...
分类:
其他好文 时间:
2020-07-18 22:47:20
阅读次数:
69
同步框架AbstractQueuedSynchronizer Java并发编程核心在于java.concurrent.util包 而juc当中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这个行为的抽象就是基于AbstractQueuedSynchron ...
分类:
其他好文 时间:
2020-07-18 19:45:38
阅读次数:
71
AQS源码解析 AQS是什么? 全称是AbstractQueuedSynchronizer,位于java.util.concurrent.locks包下面。AbstractQueuedSynchronizer是一个抽象类,其常见的派生子类有,ReentrantLock.Sync内部类。 申请锁入口方 ...
分类:
其他好文 时间:
2020-07-18 16:12:02
阅读次数:
80
摘要本分旨在快速理解分布锁的实现原理,以及不同实现方式存在的问题,阅读此文需要对mysql、zk、redis有一定的了解。 锁在Java中synchronized关键字和ReentrantLock可重入锁在我们的代码中是经常见的,一般我们用其在多线程环境中控制对资源的并发访问,但是随着分布式的快速发 ...
分类:
其他好文 时间:
2020-07-15 10:47:05
阅读次数:
74
从Lock讲起 Lock:一个接口,定义了在jdk层面上灵活实现锁的一种方式。 实现该接口的类是ReentrantLock。ReentrantLock这个单词的翻译是重入锁。 重入锁 持有锁的线程可以再次获取锁,增加重入次数,释放的锁时候也要将次数减为0。synchronized和Reentrant ...
分类:
其他好文 时间:
2020-07-12 17:10:25
阅读次数:
55
简介 AQS(AbstractQueuedSynchronizer)是并发开发中一个基础组件。主要实现了同步状态管理、线程队列管理、线程等待、线程唤醒等底层操作。JDK中许多的并发类都是依赖AQS的。 ReentrantLock(可重入锁)、Semaphore(信号量)、CountDownLatch ...
分类:
其他好文 时间:
2020-07-10 10:01:14
阅读次数:
68