简单的来说,如果一个线程组里,能保证每个线程都能拿到锁,那么这个锁就是公平锁。相反,如果保证不了每个线程都能拿到锁,也就是存在有线程饿死,那么这个锁就是非公平锁。一、引入概念1、公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进⼊队列去排队,永远都是队列的第⼀位才能得到锁。优点:所有的线程都能得到资源,不会饿死在队列中。缺点:吞吐量会下降很多,队列⾥⾯除 ......
334
0
0
2022-12-19
乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。一、引入概念1、悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就 ......
296
0
0
2022-12-19
LinkedBlockingQueue和ArrayBlockingQueue比较简单,不进行讲解了。下面只介绍PriorityBlockingQueue和DelayQueue。PriorityBlockingQueuePriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最高或最低的元素。内部使用二叉堆实现。类图结构Prio ......
322
0
0
2022-12-10
前 言 🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端 🍌 专栏简介:juc并发编程,讲解锁原理、锁机制、线程池、AQS、并发容器、并发工具等,深入源码,持续更新。 🌰 文章简介:本文主要介绍常用的并发工具类:Semaphore,Exchanger,Fork/Join框架,讲解其使用与原理文章目录1.Semaphore2.数据 ......
358
0
0
2022-12-06
前 言 🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端 🍌 专栏简介:juc并发编程,讲解锁原理、锁机制、线程池、AQS、并发容器、并发工具等,深入源码,持续更新。 🌰 文章简介:本文主要介绍常用的并发工具类:循环屏障CyclickBarrier,将深入剖析源码,讲解其使用与原理1.循环屏障的使用如果打一场游戏,必须等待游戏的 ......
293
0
0
2022-12-06
前言本文将介绍常用的并发容器,比较传统容器与并发容器的区别,介绍并发容器的基本原理。是面试常考、工作常用的热门知识点。深入源码:常用并发容器、阻塞队列使用与原理前言1.传统容器安全吗?2.常用并发容器介绍2.1 CopyOnWriteArrayList2.2 ConcurrentHashMap3.阻塞队列3.1 阻塞队列的介绍3.2 ArrayBlockin ......
284
0
0
2022-12-06
除了加锁以外,还可以使用原子类实现操作原子性。它底层采用CAS算法,使用简单、性能高效、线程安全。简单示范下它的使用。public class Demo24 { public static void main(String[] args) { AtomicInteger integer = new AtomicInteger(1) ......
311
0
0
2022-12-06
我们已经了解了AQS的的基本原理了,不如自己仿照其它锁实现一个排他锁吧。要求如下:同一时间只允许一个线程持有锁,不要求可重入(反复加锁直接忽视即可)。(1)实现Lock接口public class Demo23 { public static void main(String[] args) { } private st ......
229
0
0
2022-12-06
看看ReentrantLock中的newCondition方法final ConditionObject newCondition() { return new ConditionObject(); } 再点进去发现原来就是AQS中的内部类。public class ConditionObject implements Condition, ......
261
0
0
2022-12-06
先来回顾下公平锁的tryAcquire代码。protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if ......
276
0
0
2022-12-05
我们看下Reentrantock的源码。public void lock() { sync.lock(); } public void unlock() { sync.release(1); } 原来lock,unlock等核心方法都是通过sync来实现的。而sync其实是它的一个内部类。abstract static cla ......
275
0
0
2022-12-05
可重入锁是一种排他锁,同一时间只允许一个线程操作竞争资源。读写锁是针对读、写场景设计的,允许多个线程同时持有锁。读写锁维护了一个读锁和一个写锁。其机制如下:没有其它线程占用写锁的情况下,同一时间可以有多个线程加读锁。没有任意线程占用读锁的情况下, 同一时间只有一个线程可以加写锁。简单总结就是要么读,要么写,允许多个线程同时读,只允许一个线程单独写。看看源码。 ......
283
0
0
2022-12-05
1.ReentrantLock使用介绍之前我们一直使用的Lock实例都用的是ReentrantLock,实际上,这是一种可重入锁。简单来说,就是对同一个线程可以进行多次的加锁操作。public class Demo11 { public static void main(String[] args) { Lock lock = n ......
275
0
0
2022-12-05
Lock与Condition接口前面两篇文章回顾了传统的synchronized关键字、JMM内存模型、volitile关键字,这篇文章开始我们正式介绍juc包。在jdk5之后,juc提供了Lock,与synchronized相似,都可以实现锁功能,但是需要手动获取锁和释放锁。不过它与synchronized又不太一样,synchronized关键字相当于是 ......
258
0
0
2022-12-05
我们在这篇文章中将介绍JMM模型,也就是java内存模型。注意,本文所提到的JMM模型与JVM内存模型属于不同层次的内容。JVM内存模型讲的是物理内存空间的分配,而JMM则强调对于JVM内存模型的抽象。1.java内存模型在计算机中,为了解决主内存的速度跟不上处理器速度的问题,我们给每个处理器添加一级或多级高速缓存(如下图)。但是,每个处理器上缓存的数据如何 ......
314
0
0
2022-12-05