自旋锁是不是Lock Free?

来源:5-11 无锁境之给面试官讲讲无锁编程(Lock-Free Programming)(上)

上游猴子

2021-09-30

以 i++ 为例子。

  1. 自旋锁不是 lock free , 线程持锁后进行 i++, 如果出现突发问题,导致线程阻塞等情况未释放锁,其他线程会处于等待.

  2. 如下代码实现 i++

do {
} while(!cas(&i, i, i+1));  
i++;

如果线程跳出循环后, 相对于其他线程一定是在 i++ 成功后自行 cas ,才能跳出 while , 如果跳出 while 的线程在执行 i++ 之前也出现突发问题,导致线程阻塞等情况未释放锁 (i++ 的操作等同于 自旋锁的释放锁的操作呀), 同理, 其他线程会处于等待。
不符合lock free, 也会让其他线程等待, 为什么是 lock free?

写回答

1回答

求老仙

2021-10-06

这段程序就可以实现`i++` ,是lock-free

do {
} while(!cas(&i, i, i+1));

这段程序是lock free。因为无论哪个线程阻塞,阻塞多久,总有线程可以进步。 


自旋锁不是lock-free

// 公共变量
lock = 0

// 
spinLock(){
  do {
  } while(!cas(&lock, 0, 1))
}

spinkLock执行过程中,如果有线程持有了锁,没有释放,那么其他线程都获取不了锁(无法进步)。 


是不是 LockFree的关键是在任何情况下,都有线程能进步。

0
0

笑傲Java面试 剖析大厂高频面试真题 秒变offer收割机

深度剖析大厂面试高频真题,让你秒变offer收割机

1783 学习 · 314 问题

查看课程