锁有什么不同?本质是什么?(底层相同,上层逻辑不同)

锁就是锁而已,避免多个线程对同一个共享的数据并发修改带来的数据混乱。

锁要解决的大概就只有这 4 个问题:

  1. “谁拿到了锁” 这个信息存在哪里(可以是当前 class,当前 instance 的 markword,还可以是某个具体的 Lock 的实例)
  2. 谁能抢到锁的规则(只能有一个人抢到 - Mutex; 能抢有限多个数量- Semphore; 自己可以反复抢- 重入锁, 读可以反复抢到但是 写独占 -读写锁)
  3. 抢不到时怎么办 (抢不到玩命抢- 自旋锁;抢不到暂时睡着,等一段时间再试/等通知再试;或者二者的结合,先玩命抢几次,还没抢到就睡着)
  4. 如果锁被释放了还有其他等待锁的怎么办(不管,让等的线程通过超时机制自己抢; 按照一定规则通知某一个等待的线程;通知所有线程唤醒它们,让它们一起抢...)

有了这些选择,你就可以按照业务需求组装出你需要的锁。

关于 “互斥” 和 “同步” 的概念

  • 互斥就是线程 A 访问一组数据,线程 BCD 就不能同时访问这些数据,直到 A 停止访问了
  • 同步就是 ABCD 这些线程要约定一个执行的协调顺序。比如 D 要执行, B 和 C 必须都要做完毕,而 B 和 C 要开始, A 必须要先做完毕。
这是两种典型的并发问题。恰当的使用锁,可以解决同步或者互斥的问题。

你可以说 Mutex 是专门被设计来解决互斥的;
Barrier , Semaphore 是专门来解决同步的。但是这些都离不开 对上述 4 个问题的处理。同时,如果遇到了其它的具体的并发问题,你也可以定制一个锁来满足需要。

你可能感兴趣的:(个人感悟,How&Why)