-- 创造无限可能

js开发:同步和异步的理解-直觉理解上的差异

2022-11-06 22:02:30
430 人浏览 10 人点赞
有用,点赞支持一下

你说的是synchronization?这个有翻译的问题,当然也有你对synchronization概念理解的问题。很多人觉得synchronization指的就是互斥,操作层面这么说其实也没什么问题,毕竟,但凡被标记成synchronized的代码段,同一时间只有一个线程可以被准入。不过互斥并不是synchronization的目的,只是达到synchronization的手段。如果你回想一下很多动作片或者科幻片,譬如谍中谍这种,在小组队员分散开各自去完成任务之前,总是有一个对表的桥段(这个对表在英文里的用词就是synchronization)。那么对表是为了做什么?你的表为什么要和你队友的高度同步?是因为你们要在同一时间做同一件事情么?或者还是因为你们不能在同一时间做同一件事情?其实都不是,你们对表的目的很简单:这样你们每一个个体在独立执行任务的时候,可以在不直接通讯的情况下,确定的知道在固定的时间你的队友是什么状态。或者说精确的知道一个该被其他人完成的任务是否已经被完成。比如当你决定纵深一越跳下风井的时候,你需要确定的知道你的队友已经把风扇关了,或者你决定直面敌人关卡的时候,你确定你的队友已经把对方的系统黑了。这是同步的真谛,或者说同步的目的:被同步的独立个体可以在某些确定的契机下看到相同的,一致的数据。而在计算机中这通常意味着互斥仅仅是因为互斥访问很容易达到以上结果。想一下什么时候你会需要用到synchronized关键字:只有当一段代码修改了一些共享的数据的时候,你才有可能需要synchronized关键字。如果一段代码并没有改写共享的数据,你其实并不在乎是否有多个线程在或者不在同时执行一段代码。你真正在乎的只是一个非常简单的结果:如果你的代码对数据进行的修改,那么你的修改需要被依赖于该数据的线程完整的看到。当然现在的syncrhonized关键字实际上做到了两件事情:第一保证了数据的可见性,这点在多核cpu并且有非共享cpu缓存的时候很重要,第二防止了指令的无序调度。但最终synchronized并不是为了互斥,也不是为了并发,而是为了有序。

作者:张新潮
链接:https://www.zhihu.com/question/29634196/answer/1386224926
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。