【问题标题】:how the synchronized keyword lock the method or block using the objectsynchronized 关键字如何使用对象锁定方法或块
【发布时间】:2021-08-11 06:31:15
【问题描述】:

当我们想通过同步语句锁定块时,我们传递一个对象给它,我想知道这个对象如何锁定块,实际上我想知道通过同步关键字锁定的机制。

示例:

Object object = new Object();
synchronized (object) {
    //do something
} 

我的问题是 object 如何锁定块。

【问题讨论】:

  • 问:你的意思是Java关键字synchronized吗?
  • 是的,我的意思是java关键字同步

标签: java locking synchronized


【解决方案1】:

当线程遇到同步块(使用对象进行同步,如您的示例)时,会发生以下情况:

  1. Java 运行时检查是否有其他线程已经开始执行同步块(并且尚未完成),相同“阻塞”对象实例

  2. 如果是:我们的线程必须等待(它被阻塞)直到另一个线程完成。其他线程释放锁后(并且没有其他等待线程在out线程之前获得锁),我们的可以进入块

  3. 如果不是:我们的线程可以立即进入同步块

同一个实例是很重要的部分,考虑下面的例子:

public void method() {
    Object object = new Object();
    synchronized (object) {
        //do something
    } 
}

在这个例子中,同步永远不会发生,线程永远不会阻塞。因为每个线程在遇到块之前都会创建一个新实例。他们从不使用相同的。

【讨论】:

  • 感谢您的回答,您的意思是我们在同步语句中使用的每个对象都有一个锁并且线程获取它?
  • 技术上没有,但你可以这样想,你会用这种想法写出正确的代码。您不必知道同步的内部 java 实现即可正确使用它。
  • 但如果您对内部实现感兴趣,这里有关于该主题的进一步想法:stackoverflow.com/questions/25949145/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 2012-04-27
相关资源
最近更新 更多