在本文开始前,先给大家分享几个好用的IDEA激活码
这里提供几个最新的激活码,有需要的朋友可以试试,先到先用:
2022和2023Intellij IDEA最新激活码,IDEA稳定专属激活码(持续更新)
2022和2023Pycharm激活码,Pycharm稳定专属激活码(持续更新)
2022和2023Webstorm激活码,Webstorm稳定专属激活码(持续更新)
接受采访时,我通常会问到Java 中的synchronized关键字,我从几乎每个人那里得到了正确的理论答案。这就是我收到答案的方式。如果一个块或一个方法是同步的,只有一个线程可以进入该方法并阻塞,另一个线程将等待直到前一个线程尚未退出该方法或块。
我询问了程序的行为。我要求读者在阅读博客的其余部分之前先猜测其行为。
大多数情况下,受访者会给出以下答案:
假设名为 Thread1 的线程 t1 进入同步块,它将打印“ Thread1 已进入同步块”。然后它将休眠 5 秒钟。同时,Thread2会在注释为第3行的行中等待,Thread1退出后,Thread2会进入block,打印“ Thread2 has entered the synchronized block ”并休眠5分钟,之后整个程序结束。
如果你的回答和上面一样,那么你就缺少对 synchronized 关键字的批判性理解。基本上,当我们使用 synchronized 关键字时,我们通常会锁定类的实例或 Class 对象(对于该类的所有实例只有一个)本身。在这种情况下,我们锁定了 this 关键字,这意味着 Task 类的实例。在第 1 行和第 2 行创建线程时,我们使用了 new Task(),这意味着同一类任务的两个不同对象。因此,Thread1 和 Thread2 已经在同一个类的不同实例上获取了锁,因此这两个线程将只使用自己的锁进入同步块,不会相互等待。所以,答案应该是
Thread1已经进入synchronized块。马上, Thread2 已经进入synchronized就会被打印出来。 两个线程将同时等待 5 秒,程序将终止。
然后,行为将与我首先解释的行为完全相同,即 Thread1 将打印Thread1 已进入同步块并等待 5 秒。退出后,Thread2 会打印Thread2 has entered the synchronized block and will sleep for 5 seconds。退出后,程序将终止。
这是一件非常小的事情,但是在准备面试或编写多线程代码时需要注意这一点。实现信号量、循环屏障、倒计时锁存器或可重入锁时也是如此。
希望你已经掌握了这篇博客的要点。
发布者:admin,转转请注明出处:https://www.ajihuo.com/soft/5560.html