当前位置: 首页 > 面试题库 >

Java中的同步方法和同步块有什么区别?

裴建华
2023-03-14
问题内容

Java中的同步方法和同步块有什么区别?

我一直在网上搜索答案,人们似乎对此不太确定:-(

我的看法是,两者之间没有区别,只是synch块的作用域可能更多,因此锁定的时间更少了?

如果在静态方法上使用Lock,则采用什么Lock?班级锁是什么意思?


问题答案:

同步方法将方法接收器用作锁(即,this用于非静态方法,而用于静态方法的封闭类)。 Synchronizedblocks将表达式用作锁。

因此,以下两种方法等效于锁定预期对象

synchronized void mymethod() { ... }

void mymethod() {
  synchronized (this) { ... }
}

对于静态方法,该类将被锁定:

class MyClass {
  synchronized static mystatic() { ... }

  static mystaticeq() {
    syncrhonized (MyClass.class) { ... }
  }
}

对于同步块,可以将任何非null对象用作锁:

synchronized (mymap) {
  mymap.put(..., ...);
}

锁定范围

对于同步方法,该锁将在整个方法范围内保持,而在synchronized块中,该锁仅在该块范围内保持(否则称为关键节)。实际上,如果JVMsynchronized可以证明可以安全完成,则可以通过从块执行中删除一些操作来进行优化。



 类似资料:
  • 问题内容: 可以说我们有以下两个示例代码: 还有这个 所以有人可以告诉我现在有什么区别吗? 问题答案: 这两种不同的方法在 功能上是等效的 。有 可能 是一个非常小的 性能 差异: 在字节码级别,作为方法访问标记中设置的位, 同步方法 公布其同步需求。JVM查找该位标志并进行适当同步。 该 同步块 通过存储在该方法的类文件中的字节码定义的操作序列实现其同步。 因此,同步方法 可能会以 更快的速度执

  • 问题内容: 之间有什么区别 和 如果我错了,请忽略此问题。 问题答案: 在第一个线程中,只有一个线程一次可以执行整个方法,而在第二个线程中,如果不将 其 用作参数,则只有一个线程可以执行该同步块。 这是它的副本。使用同步方法而不是同步块是否有优势?

  • 问题内容: 对于旅行预订Web应用程序,如果有100个并发用户登录,是否应该通过“同步”或“静态同步”方法来实现机票预订并生成“电子机票编号”? 问题答案: 好了,您是否知道静态方法和实例方法之间的一般区别? 唯一的区别是,在VM开始运行该方法之前,它必须获取监视器。对于实例方法,获得的锁是与您要在其上调用该方法的对象相关联的锁。对于静态方法,获取的锁与类型本身关联- 因此,其他线程将无法同时调用

  • 问题内容: 我正在查看包含同步方法的第三方库中的一些代码,在此方法中,有一个锁定在实例变量上的同步块。与此类似: 这有意义吗?如果是这样,在同步方法中使用同步语句有什么好处? 鉴于同步方法锁定了整个对象,对我来说似乎是多余的。在使用非私有的实例变量时,这种方法是否有意义? 问题答案: 在您的示例中,该方法 同时 锁定了和的实例。其他方法可能仅锁定对象的实例 或 对象。 因此,是的,这完全取决于他们

  • 问题内容: 我已经开始学习线程同步。 同步方法: 同步块: 什么时候应该使用方法和块? 为什么块比方法更好? 问题答案: 这不是更好的问题,只是有所不同。 同步方法时,实际上是在与对象本身进行同步。对于静态方法,您正在同步到对象的类。因此,以下两段代码以相同的方式执行: 就像您写的一样。 如果要控制到特定对象的同步,或者只想将方法的 一部分 同步到该对象,则指定一个块。如果在方法声明上使用关键字,

  • 本文向大家介绍请分析一下同步方法和同步代码块的区别是什么?相关面试题,主要包含被问及请分析一下同步方法和同步代码块的区别是什么?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JAVA代码块同步 参考回答: 区别:同步方法默认用this或者当前类class对象作为锁; 同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法。