多个线程(或进程)要执行同一个特定的不可重入的程序代码块(称为临界区),这就需要适当的并发控制同步技术。否则,可能会发生竞态条件。
--维基百科
说白了就是但多个线程间同时要对某一区域块(临界区/临界资源)操作,需要运用一些技术手段来对临界资源进行保护,避免共同使用期间产生混乱。
举个简单的例子,我们支付宝给 ?@旺柴先生 转账?1RBM,这个时候同时也有另外一个人给他转账?1RBM,这时他自己的钱包已经有1块钱来,但由于这两笔账是同时进账的,所以非线程同步系统会作出如下操作:
非线程同步最终取钱包余额为2元,显然是不对的,我们来看看加上线程同步后:
最终取钱包余额为3元,这里的解决方案采用了加锁?来解决,那么具体的都有哪几种方式呢?
我们这里也可以用一个更通俗的例子来说明:
有一个新修建的十字路口,刚开始的适合这个路口没多少车辆?,大家每次到这个路口都很愉快地通过了可是慢慢的知道这条路的人越来越多,但是大家都没有秩序地通过路口,结果有一天就出了事故了,所以负责道路设施的人来装了一个红绿灯,只有这个方向的绿灯亮了,这个方向的人方可前行,这就是互斥锁
而有的车辆到这里不一定是要过路口的,有的车辆这是到这里掉个头,所以负责道路设施的人就设计了一条掉头车道,允许掉头的车辆?通过,而不用跟直行车辆等待红灯才能掉头。这就是读写锁
附近有家仓库发生火灾了,消防车占用了转弯车道(占用资源不释放,自己过了别人才能过),直到消防车队???通过后后面的车辆才能正常通行,这就是自旋锁
这个路口是城区入口,久而久之交通压力变大,交通部门开始指定规定,早晚高峰时段外埠车辆禁止通行,且限号出现,这就是增加“条件变量”添加缓冲区缓解压力
有些例子可能不那么准确,比如自旋锁,但通过这个例子结合实际理论可我们可以快速理解记忆各个锁?的特点。
以上是两个生活示例带你理解“线程同步原理”的详细内容。更多信息请关注PHP中文网其他相关文章!