穿线及;java中的锁

穿线及;java中的锁,java,multithreading,locking,Java,Multithreading,Locking,我听说java中的每个对象都有一个与之关联的内在锁。如果一个线程使用这个锁来调用synchronized方法呢。这是否意味着没有其他线程可以访问此对象中的任何方法或仅访问同步方法 只有一个线程可以同时访问同步方法 见: 首先,同一对象上的两个同步方法调用不可能交错。当一个线程为一个对象执行同步方法时,调用同一对象块的同步方法的所有其他线程(暂停执行),直到第一个线程对该对象执行完毕 实例方法上的synchronized是整个方法体周围的synchronized(this){}的缩写。对于静态方法

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

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

见:

首先,同一对象上的两个同步方法调用不可能交错。当一个线程为一个对象执行同步方法时,调用同一对象块的同步方法的所有其他线程(暂停执行),直到第一个线程对该对象执行完毕


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

只有一个线程可以获得锁,因此表面上一次只能有一个线程进入。丢失线程阻塞,直到锁可用

这还不是故事的全部。如果在
synchronized
块中的某个地方(可能在另一个方法中),线程调用
this.wait()
(带有可选参数),然后该线程在
wait()
期间释放锁。在此期间,锁可用,例如,调用
this.notifyAll()


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

但是当线程访问synchronized方法时,其他线程可以同时访问非同步方法?!当它从等待中返回时,如果另一个线程有锁呢!它会一直等到另一个线程释放锁,而这个线程在从
wait
返回之前已经获得了锁。您是否考虑过查阅文档?而不是依赖于你所听到的?或者你能在这里找到什么?