各种各样的"锁"
根据分类标准我们把锁分为以下 7 大类别,分别是:
偏向锁/轻量级锁/重量级锁;
可重入锁/非可重入锁;
共享锁/独占锁;
公平锁/非公平锁;
悲观锁/乐观锁;
自旋锁/非自旋锁;
可中断锁/不可中断锁。
Ssssongsmith 奕飞
这个作者很懒,什么都没留下…
展开
-
28-JVM 对锁进行了哪些优化?
相比于 JDK 1.5,在 JDK 1.6 中 HotSopt 虚拟机对 synchronized 内置锁的性能进行了很多优化,包括自适应的自旋、锁消除、锁粗化、偏向锁、轻量级锁等。有了这些优化措施后,synchronized 锁的性能得到了大幅提高,下面我们分别介绍这些具体的优化。自适应的自旋锁首先,我们来看一下自适应的自旋锁。先来回忆一下自旋的概念和自旋的缺点。“自旋”就是不释放 CPU,一直循环尝试获取锁,如下面这段代码所public final long getAndAddLong(Objec原创 2020-12-25 08:08:50 · 153 阅读 · 0 评论 -
27-什么是自旋锁?自旋的好处和后果是什么呢?
什么是自旋首先,我们了解什么叫自旋?“自旋”可以理解为“自我旋转”,这里的“旋转”指“循环”,比如 while 循环或者 for 循环。“自旋”就是自己在这里不停地循环,直到目标达成。而不像普通的锁那样,如果获取不到锁就进入阻塞。对比自旋和非自旋的获取锁的流程下面我们用这样一张流程图来对比一下自旋锁和非自旋锁的获取锁的过程。首先,我们来看自旋锁,它并不会放弃 CPU 时间片,而是通过自旋等待锁的释放,也就是说,它会不停地再次地尝试获取锁,如果失败就再次尝试,直到成功为止。我们再来看下非自旋锁原创 2020-12-24 23:39:17 · 444 阅读 · 7 评论 -
26-读锁应该插队吗?什么是读写锁的升降级?
读锁插队策略首先,我们来看一下读锁的插队策略,公平与非公平锁中说到的 ReentrantLock,如果锁被设置为非公平,那么它是可以在前面线程释放锁的瞬间进行插队的,而不需要进行排队。在读写锁这里,策略也是这样的吗?首先,我们看到 ReentrantReadWriteLock 可以设置为公平或者非公平,代码如下:公平锁:ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true原创 2020-12-23 23:39:52 · 186 阅读 · 7 评论 -
25::读写锁 ReadWriteLock 获取锁有哪些规则?
在没有读写锁之前,我们假设使用普通的 ReentrantLock,那么虽然我们保证了线程安全,但是也浪费了一定的资源,因为如果多个读操作同时进行,其实并没有线程安全问题,我们可以允许让多个读操作并行,以便提高程序效率。但是写操作不是线程安全的,如果多个线程同时写,或者在写的同时进行读操作,便会造成线程安全问题。我们的读写锁就解决了这样的问题,它设定了一套规则,既可以保证多个线程同时读的效率,同时又可以保证有写入操作时的线程安全。整体思路是它有两把锁,第 1 把锁是写锁,获得写锁之后,既可以读数据又可以原创 2020-12-23 08:48:33 · 151 阅读 · 9 评论 -
24-讲一讲公平锁和非公平锁,为什么要“非公平”?
什么是公平和非公平首先,我们来看下什么是公平锁和非公平锁,公平锁指的是按照线程请求的顺序,来分配锁;而非公平锁指的是不完全按照请求的顺序,在一定情况下,可以允许插队。但需要注意这里的非公平并不是指完全的随机,不是说线程可以任意插队,而是仅仅“在合适的时机”插队。那么什么时候是合适的时机呢?假设当前线程在请求获取锁的时候,恰巧前一个持有锁的线程释放了这把锁,那么当前申请锁的线程就可以不顾已经等待的线程而选择立刻插队。但是如果当前线程请求的时候,前一个线程并没有在那一时刻释放锁,那么当前线程还是一样会进入等原创 2020-12-21 09:31:15 · 340 阅读 · 5 评论 -
23-Lock 有哪几个常用方法?分别有什么用?
简介Lock 接口是 Java 5 引入的,最常见的实现类是 ReentrantLock,可以起到“锁”的作用。Lock 和 synchronized 是两种最常见的锁,锁是一种工具,用于控制对共享资源的访问,而 Lock 和 synchronized 都可以达到线程安全的目的,但是在使用上和功能上又有较大的不同。所以 Lock 并不是用来代替 synchronized 的,而是当使用 synchronized 不合适或不足以满足要求的时候,Lock 可以用来提供更高级功能的。通常情况下,Lock原创 2020-12-20 23:34:39 · 190 阅读 · 8 评论 -
22-synchronized 和 Lock 孰优孰劣,如何选择?
相同点synchronized 和 Lock 的相同点非常多,我们这里重点讲解 3 个比较大的相同点。synchronized 和 Lock 都是用来保护资源线程安全的。这一点毋庸置疑,这是它们的基本作用。都可以保证可见性。对于 synchronized 而言,线程 A 在进入 synchronized 块之前或在 synchronized 块内进行操作,对于后续的获得同一个 monitor 锁的线程 B 是可见的,也就是线程 B 是可以看到线程 A 之前的操作的,这也体现了 happen原创 2020-12-20 10:08:03 · 156 阅读 · 3 评论 -
21-如何看到 synchronized 背后的“monitor 锁”?
获取和释放 monitor 锁的时机我们都知道,最简单的同步方式就是利用 synchronized 关键字来修饰代码块或者修饰一个方法,那么这部分被保护的代码,在同一时刻就最多只有一个线程可以运行,而 synchronized 的背后正是利用 monitor 锁实现的。所以首先我们来看下获取和释放 monitor 锁的时机,每个 Java 对象都可以用作一个实现同步的锁,这个锁也被称为内置锁或 monitor 锁,获得 monitor 锁的唯一途径就是进入由这个锁保护的同步代码块或同步方法,线程在进入被原创 2020-12-19 22:50:06 · 193 阅读 · 7 评论 -
20-悲观锁和乐观锁的本质是什么?
首先我们看下悲观锁与乐观锁是如何进行分类的,悲观锁和乐观锁是从是否锁住资源的角度进行分类的。悲观锁悲观锁比较悲观,它认为如果不锁住这个资源,别的线程就会来争抢,就会造成数据结果错误,所以悲观锁为了确保结果的正确性,会在每次获取并修改数据时,都把数据锁住,让其他线程无法访问该数据,这样就可以确保数据内容万无一失。这也和我们人类中悲观主义者的性格是一样的,悲观主义者做事情之前总是担惊受怕,所以会严防死守,保证别人不能来碰我的东西,这就是悲观锁名字的含义。我们举个例子,假设线程 A 和 B 使用的都是悲原创 2020-12-19 07:55:04 · 185 阅读 · 0 评论