Java线程同步很像火车上的厕所

阅读: 评论:0

Java线程同步很像火车上的厕所

Java线程同步很像火车上的厕所

  • 线程同步的概念:

线程同步的根本目的就是为了保证线程对同步代码或者同步函数one by one的运行,最终目的是为了保证数据的一致性。

每一个对象都可以充当这样的锁,因为任意一个对象都有一个标志位,有1和0两种状态
    *当程序执行到synchronized代码块的时候线程会检查对象的标志位是1还是0
    *如果是1则执行程序,同时将对象的标志位设置为0,其他线程执行到synchronized代码块时一看对象标志位为0
    *则线程会阻塞,一直等到对象的标志位为1再执行下面的程序 

如上的过程很像火车上的厕所,在上厕所之前,查看门上的标志:有人还是空闲;如果有人,则等待,如果没人,则进去使用;进到厕所后,把门插好,即更新了门上的标志,把空闲变为有人;这个过程中,如果有其他要使用厕所,则会在门口等待;使用完毕后,把标志改为空闲,离开厕所;其他人按照先来后到的顺序得到使用厕所的机会。

我们也可以把对象标志位看成一个监视器,当一个线程执行到synchronized代码块的时候会检查监视器的状态,一个刚执行完synchronized代码块的线程也可以再次检查监视器并执行synchronized代码块;
多个线程要实现同步,必须使用相同的监视器对象;

如果多个线程使用的不是同一个监视器对象则达不到同步的效果

 

  • 线程同步的不仅仅是一个代码块

同步过程需要注意的一点是:同步的不仅仅是同一个代码块,也可以是多个代码块进行同步,例如一个方法内的多个同步函数,他们之间是同步的,即在任意一个时刻,只有一个线程访问一个方法,其他的方法也是不允许访问的。例如集合的put和get操作,既不允许多个线程同时put或者同时get,也不允许同时有线程put和get。

 

  • 对sleep 和 yield方法不释放对象锁的理解

线程sleep和yield的过程中是不释放对象锁的,因此同时对该锁同步的其他线程没有机会执行。为什么这样呢,我的理解是:既然线程同步的根本目的就是为了保证线程对同步代码或者同步函数one by one的运行,最终目的是为了保证数据的一致性。sleep和yield的调用可能出现在同步代码中,如果释放了锁,允许其他同步的线程执行,这样就打破了让同步线程one-by-one执行的目的,数据的一致性被破坏。

本文发布于:2024-01-30 02:36:06,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170655336618630.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:线程   很像   火车上   厕所   Java
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23