【问题标题】:Threading & locks in javajava中的线程和锁
【发布时间】:2020-10-28 08:08:06
【问题描述】:

我听说java中的每个对象都有一个与之关联的内在锁。如果一个线程使用这个锁来调用同步方法怎么办。这是否意味着没有其他线程可以访问此对象中的任何方法或只能访问同步方法?!

【问题讨论】:

  • 您是否考虑过查阅文档?而不是依靠你“听到”的东西?或者可以在这里找到?

标签: java multithreading locking


【解决方案1】:

只有一个线程可以同时访问同步方法。

official documentation:

首先,同一对象上的同步方法的两次调用不可能交错。当一个线程正在为一个对象执行同步方法时,所有其他为同一对象调用同步方法的线程都会阻塞(暂停执行),直到第一个线程处理完该对象。

【讨论】:

  • 但是当线程访问同步方法时,其他线程可以同时访问非同步方法?!
【解决方案2】:

实例方法上的synchronized 是整个方法体周围synchronized (this) { } 的简写。对于静态方法,它相当于synchronized (this.class) { }。所以想想synchronized (obj) { }

只有一个线程可以获取锁,所以表面上一次只能有一个线程进入。失败者线程阻塞直到锁可用。

这还不是全部。如果在synchronized 块内的某处(可能在另一种方法中)线程调用this.wait();(带有可选参数),则该线程在wait() 的持续时间内释放锁。在此期间,锁可用,例如调用this.notifyAll()

另外值得注意的是锁是可重入的。可以递归调用另一个或相同的synchronized 方法。

【讨论】:

  • 当它从等待返回时,如果另一个线程有锁怎么办!
  • 它等到另一个线程释放锁并且这个线程在从wait返回之前获得了它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多