Double-Checked-Locking

之前一直知道这种写法,今天偶然发现居然是有专门的名词解释这种方式,特此记录。

在代码中如果要做一项处理,为了防止竞态条件(race condition)产生,需要通过加锁的方式保证同时只有一个线程在处理。

而有时,为了提升效率,这个处理是做一次就可以(比如上传文件等耗时的操作),有时这个处理必须只能进行一次(比如单例对象的初始化)。

这时如果简单的在锁之前判断一下处理是否做过的标志,就会产生问题。

因为在多线程情况下,可能会产生多个线程都判断了标志,发现没有做过处理,这时多个线程会同时获取锁,获取到之后会都进行一次处理。

因为锁的缘故,同时只能有一个线程在做处理,但是多个线程会做多次处理。

为了避免这种情况,需要在锁之前判断一下标志,获得锁之后再判断一下标志。

参考资料#

https://en.wikipedia.org/wiki/Double-checked_locking

comments powered by Disqus