锁的深入理解

关于“互斥”和“同步”的概念
  • 互斥就是线程A访问了一组数据,线程BCD就不能同时访问这些数据,直到A停止访问了
  • 同步就是ABCD这些线程要约定一个执行的协调顺序。比如D要执行,B和C必须都得做完,而B和C要开始,A必须先得做完。
这是两种典型的并发问题。恰当的使用锁,可以解决同步或者互斥的问题。
锁的目的就是避免多个线程对同一个共享的数据并发修改带来的数据混乱。
锁的实现要处理的大概就只有这4个问题:
  • “谁拿到了锁(临界区)“这个信息存哪里(可以是当前class,当前instance的markword,还可以是某个具体的Lock的实例)
  • 谁能抢到锁的规则(只能一个人抢到 - Mutex;能抢有限多个数量 - Semaphore;自己可以反复抢 - 重入锁;读可以反复抢到但是写独占 - 读写锁……)
  • 抢不到时怎么办(抢不到玩命抢;抢不到暂时睡着,等一段时间再试/等通知再试;或者二者的结合,先玩命抢几次,还没抢到就睡着)
  • 如果锁被释放了还有其他等待锁的怎么办(不管,让等的线程通过超时机制自己抢;按照一定规则通知某一个等待的线程;通知所有线程唤醒他们,让他们一起抢……)
原文地址:https://www.cnblogs.com/findbetterme/p/11347145.html