Double-Checked-Locking
之前一直知道这种写法,今天偶然发现居然是有专门的名词解释这种方式,特此记录。
在代码中如果要做一项处理,为了防止竞态条件(race condition)产生,需要通过加锁的方式保证同时只有一个线程在处理。
而有时,为了提升效率,这个处理是做一次就可以(比如上传文件等耗时的操作),有时这个处理必须只能进行一次(比如单例对象的初始化)。
这时如果简单的在锁之前判断一下处理是否做过的标志,就会产生问题。
因为在多线程情况下,可能会产生多个线程都判断了标志,发现没有做过处理,这时多个线程会同时获取锁,获取到之后会都进行一次处理。
因为锁的缘故,同时只能有一个线程在做处理,但是多个线程会做多次处理。
为了避免这种情况,需要在锁之前判断一下标志,获得锁之后再判断一下标志。