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

在lockObject上同步和将此作为锁之间有什么区别?

于捷
2023-03-14
问题内容

我知道同步方法和同步块之间的区别,但是我不确定同步块部分。

假设我有这段代码

class Test {
  private int x=0;
  private Object lockObject = new Object();

  public void incBlock() {
    synchronized(lockObject) {
      x++;
    }
    System.out.println("x="+x);
  }

  public void incThis() {  // same as synchronized method
    synchronized(this) {
      x++;
    }
    System.out.println("x="+x);
  }
}

在这种情况下,使用 lockObject 和将 用作锁之间有什么区别?对我来说似乎是一样的。

当您决定使用同步块时,如何确定哪个对象是锁?


问题答案:

我个人几乎从不锁定“ this”。我通常锁定一个私有的引用,我知道没有其他代码可以锁定。如果您锁定“ this”,那么 任何
其他了解您对象的代码都可能选择锁定该对象。尽管这种情况不太可能发生,但它肯定可以实现-并可能导致死锁或仅仅是过度锁定。

关于锁定的内容,没有什么特别神奇的-您可以有效地将其视为令牌。任何使用相同令牌进行锁定的人都将尝试获取相同的锁定。除非您 希望
其他代码能够获取相同的锁,否则请使用私有变量。我 鼓励您创建变量final-我不记得 曾经 在对象的整个生命周期内更改过锁变量的情况。



 类似资料:
  • 问题内容: 这两个关键字具有完全相同的效果,还是我应该注意一些事情? 问题答案: 根据此站点的资料:[http]( http://en.csharp- online.net/CSharp_FAQ:_What_is_the_difference_between_CSharp_lock_and_Java_synchronized) //en.csharp-online.net/CSharp_FAQ :

  • 问题内容: 我一直在阅读nodebeginner, 并且遇到了以下两段代码。 第一个: 第二个: 我得到了他们应该做的事情,他们查询数据库以检索查询的答案。然后。 第一个应该是同步代码。第二个是异步代码。 这两部分之间的区别对我来说很模糊。输出是什么? 搜寻异步编程也无济于事。 问题答案: 区别在于,在第 一个示例中 ,程序将在第一行中阻塞。下一行()必须等待。 在 第二个示例中 ,将在处理查询时

  • 问题内容: 我写了一个简单的代码来模拟使用and的并发。 源代码如下: 任务类 包括一个用于打印线程名称和执行经过时间的方法。 TaskWithLock 类 TaskWithSync 类 主 班 第一次,通过调用方法 runableTasks(TaskWithSync.class); 执行带有Synchronized的任务 ; 第二次,通过调用 runableTasks(TaskWithLock.

  • 问题内容: 我一直在阅读nodebeginner,并且遇到了以下两段代码。 第一个: 第二个: 我得到了他们应该做的事情,他们查询数据库以检索查询的答案。然后。 第一个应该是同步代码。第二个是异步代码。 这两件作品之间的区别对我来说很模糊。输出是什么? 搜寻异步编程也没有帮助我。 问题答案: 区别在于,在第 一个示例中 ,程序将在第一行中阻塞。下一行()必须等待。 在 第二个示例中 ,将在处理查询

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

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型