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

在Java关键部分中,应该同步哪些内容?

尉迟招
2023-03-14
问题内容

在Java中,在代码中声明关键部分的惯用方式如下:

private void doSomething() {
  // thread-safe code
  synchronized(this) {
    // thread-unsafe code
  }
  // thread-safe code
}

几乎所有块都在上同步 this,但这是否有特定原因?还有其他可能性吗?是否有关于同步对象的最佳实践?(例如Object?的私有实例)


问题答案:

首先,请注意以下代码段是相同的。

public void foo() {
    synchronized (this) {
        // do something thread-safe
    }
}

和:

public synchronized void foo() {
    // do something thread-safe
}

完全一样的事情 。除了代码的可读性和样式之外,它们都不是其中之一。

当您同步方法或代码块时,重要的是要知道 为什么 要这样做,要锁定的 对象 到底是 什么,目的什么

还要注意,在某些情况下,您可能需要 客户端同步 代码块,而在这些情况下,您要的监视器(即,同步对象)不一定是必须的this,例如本例:

Vector v = getSomeGlobalVector();
synchronized (v) {
    // some thread-safe operation on the vector
}

我建议您了解有关并发编程的更多知识,一旦您确切了解幕后发生的事情,它将为您提供大量帮助。您应该阅读《Java并行编程》,这是一本关于该主题的好书。如果您想快速了解该主题,请查看Java
Concurrency
@Sun。



 类似资料:
  • 本文向大家介绍Java中的同步关键字,包括了Java中的同步关键字的使用技巧和注意事项,需要的朋友参考一下 当我们在程序中启动两个或多个线程时,可能会出现多个线程尝试访问同一资源,最终由于并发问题,它们可能产生无法预料的结果的情况。例如,如果多个线程试图在同一文件中写入数据,则它们可能会破坏数据,因为其中一个线程可以覆盖数据,或者一个线程同时打开同一文件时,另一个线程可能正在关闭同一文件。 因此,

  • 这个问题以前可能已经回答过了,但是由于这个问题的复杂性,我需要一个确认。所以我重新措辞这个问题 问题1:当一个线程进入一个同步块时,内存屏障将包括被触摸的任何字段,而不仅仅是我同步的对象的字段?因此,如果在一个同步块中修改了许多对象,那么在线程内存缓存之间会有大量内存移动。 问题 2 : 在线程 1 中隐式地是“发生前”关系的一部分? 我希望是这样,但可能不是这样。如果没有,有没有一个技巧可以让它

  • 本文向大家介绍SQL语言包括哪几部分?每部分都有哪些操作关键字?相关面试题,主要包含被问及SQL语言包括哪几部分?每部分都有哪些操作关键字?时的应答技巧和注意事项,需要的朋友参考一下 答:SQL语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL)四个部分。 数据定义:Create Table,Alter Table,Drop Table, Craete/Drop

  • 我正在使用POM设计模式创建一个UI测试自动化框架。在阅读了SeleniumHQ页面中的页面对象之后,我开始思考应该在页面对象中创建哪些方法。 让我们举一个登录页面对象的简单例子,该对象由用户名、密码文本框和提交按钮组成。SeleniumHQ link创建了以下方法: 看着这些方法,我有点困惑。当我已经在创建loginAs方法时,为什么要创建前3个方法(typeUsername、typePassw

  • 问题内容: java中static关键字的用法有哪些? 问题答案: static 成员属于类而不是特定实例。 这意味着即使你创建了该类的一百万个实例,也没有创建任何实例,该字段仅存在一个实例[1]。它将被所有实例共享。 由于方法也不属于特定实例,因此它们不能引用实例成员。在给定的示例中,不知道应引用该类的哪个实例(以及该类的哪个实例)。成员只能引用成员。实例成员当然可以访问成员。 旁注:当然,成员

  • 假设d是我们用来调用wait的对象。当线程调用d.wait时,它必须拥有d的内部锁,否则会引发错误。在同步方法中调用等待是获取内部锁的一种简单方法。 那么这是不是意味着两个线程不能同时调用wait()。这里的固有锁是什么意思【提到它是监视器】?但是monitor是如何实现互斥的呢? 一旦线程调用等待,它是否永远持有对象?如果是这样,其他线程使用该锁通知All()怎么样? 如果我们需要在 Notif