【发布时间】:2020-10-28 08:08:06
【问题描述】:
我听说java中的每个对象都有一个与之关联的内在锁。如果一个线程使用这个锁来调用同步方法怎么办。这是否意味着没有其他线程可以访问此对象中的任何方法或只能访问同步方法?!
【问题讨论】:
-
您是否考虑过查阅文档?而不是依靠你“听到”的东西?或者可以在这里找到?
标签: java multithreading locking
我听说java中的每个对象都有一个与之关联的内在锁。如果一个线程使用这个锁来调用同步方法怎么办。这是否意味着没有其他线程可以访问此对象中的任何方法或只能访问同步方法?!
【问题讨论】:
标签: java multithreading locking
只有一个线程可以同时访问同步方法。
首先,同一对象上的同步方法的两次调用不可能交错。当一个线程正在为一个对象执行同步方法时,所有其他为同一对象调用同步方法的线程都会阻塞(暂停执行),直到第一个线程处理完该对象。
【讨论】:
实例方法上的synchronized 是整个方法体周围synchronized (this) { } 的简写。对于静态方法,它相当于synchronized (this.class) { }。所以想想synchronized (obj) { }。
只有一个线程可以获取锁,所以表面上一次只能有一个线程进入。失败者线程阻塞直到锁可用。
这还不是全部。如果在synchronized 块内的某处(可能在另一种方法中)线程调用this.wait();(带有可选参数),则该线程在wait() 的持续时间内释放锁。在此期间,锁可用,例如调用this.notifyAll()。
另外值得注意的是锁是可重入的。可以递归调用另一个或相同的synchronized 方法。
【讨论】:
wait返回之前获得了它