互斥锁

多线程语言容易发生的一个问题是线程之间状态不同步。比如有两个线程A和B,A线程要对一个资源进行删除操作,B线程要对一个资源进行修改操作,这时候两个线程容易发生冲突。JS是单线程语言,貌似不会发送这种情况,但是真的如此吗?请看下面这个情况,这是在处理公司业务时碰到的,具体代码无法透漏:
lock
本地状态需要跟服务器状态同步,并且采取轮询策略。同时本地又是可以一直操作的,所以如果网络延迟就会产生图中的情况,本地数据会一直跳变。
这时可以借用多线程之间互斥锁的思想,将过程简化如下:
lock
简化之后,就发现本地操作和服务端操作两个线程要对UI这个资源同时进行操作,所以需要加个互斥锁,本地操作时禁止服务端进行操作,本地操作完成并且收到服务端的回调才解锁。

总结:多线程事件如框架组件内部数据更新、git协作开发等合作事件,最重要的是找出共享资源,理清楚操作方和他们之间的关系,再进行工作协调,保证每次只有一方在操作共享资源,保证所有状态同步。