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