articles
关于锁 (Lock)

关于锁 (Lock)

Published on 2023-06-30

锁是什么

想象一下,你正在参加一个大型派对,派对上有一间只能容纳一个人使用的洗手间。当有人在使用洗手间时,其他人必须等待他出来。这就是的基本概念。在编程世界中,就像那个洗手间的门,而线程就像派对的参与者

锁的含义

在我们的派对例子中,如果没有(也就是洗手间的门),那么可能会出现尴尬的情况,比如两个人同时走进洗手间。在编程世界中,这种情况可能导致数据的不一致性和其他一些难以预料的问题。

排他锁和共享锁

锁可以分排他锁(也称为互斥锁)和共享锁

现在,让我们把派对的规模扩大一些,假设有一间大洗手间,可以容纳多个人同时使用。但是,如果有人需要使用洗手间来更换衣服,那么他们就需要确保洗手间里没有其他人。这就是排他锁共享锁的概念。

排他锁就像是一个人需要更换衣服,他需要确保洗手间里没有其他人。在这种情况下,只有一个线程(派对的参与者)可以访问资源(洗手间)。

共享锁则像是多个人可以同时使用洗手间,在这种情况下,多个线程可以同时访问资源。但是如果有线程需要写入(更换衣服),那么它必须先获取排他锁

公平锁和非公平锁

公平锁就像是洗手间的排队规则,每个人都必须按照到达的顺序等待使用洗手间。也就是说,如果你后来,你就需要到队伍的最后面去,找个凳子坐下,耐心等待。这就像一个线程在请求锁时,如果锁已经被其他线程占用,那么这个线程就会进入一个等待队列,等待前面的线程释放锁。这种方式是公平的,因为它保证了每个线程都会按照请求锁的顺序获取到锁。

非公平锁则不同,它就像是一个新来的人,他刚好看到有人刚从洗手间出来,他就可以直接进入洗手间,不用排队等待。在锁的世界中,当一个线程请求锁时,如果锁已经被其他线程占用,这个线程不会马上进入等待队列,而是会尝试直接获取锁。如果获取失败,它才会进入等待队列。

非公平锁虽然可能看起来不那么公正,但是由于它减少了线程切换和调度的开销,所以性能上会比公平锁更好。

pthread 是什么

TODO

AQS 是什么

AQS (Abstract Queued Synchronizer) 是 Java 标准库中的一个管程工具。

AQS 就像是派对洗手间的管理员,他负责管理洗手间的使用,确保每个人都能按照自己的需要使用洗手间。因此,如果洗手间当前无法满足你的使用 (如厕/更换衣服) 时,你只能先在外面坐着等着。