←首页

最近看到的一篇文章关于多线程编程中常出现的悲观锁与乐观锁。我们熟悉的 js 是单线程,但在开发中我们也常常遇到锁的问题。

我们常见的锁,比如点击提交表单的时候,为了防止多次提交,我们会在请求前加上标志位,避免用户多次点击或者代码出 bug 导致请求重复。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var block = false
function refesh () {
if (block) {
return
}
block = true

return fetch('api')
.then(res => {
block = false
})
.catch(err => {
block = false
})
}

我理解这在某种意义上就是悲观锁,无论你访问多少次这个方法,只要我的请求还没有完成,就不允许其他人访问。

同样也有乐观锁的问题,比如之前做虚拟头像的时候就遇到锁的问题,我们允许用户切换头像组件,每次点击切换头像时(做了节流)去下载所有需要展示组件的图片(异步请求),但是在资源下载完之前,用户再次点击其他组件,我们会去下载新的资源。也就是每次都以最新的组件为准,之前的请求照常发起,只是无论结果如何都会被丢弃了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var id = 0
function loadManifest (resources) {
var load_id = ++id
PromiseAll(resources)
.then(() => {
if (load_id === id) {
//渲染
} else {
//废弃
}
})
.catch(() => {
if (load_id === id) {
//提醒网络错误
} else {
//废弃
}
})
}

btn.addEventListener('click', () => {
loadManifest(resources)
})

这在某种意义上是乐观锁了,任何人都可以访问,但是如果结束的时候需要自行某种操作,需要检查证件,没有将军令就不能动兵。

如需转载,请注明出处: http://w3ctrain.com / 2017/11/12/pessimistic-lock-and-optimistic-lock/

helkyle

我叫周晓楷

我现在是一名前端开发工程师,在编程的路上我还是个菜鸟,w3ctrain 是我用来记录学习和成长的地方。