现在,我不确定这是否是一个愚蠢的问题,如果是,请耐心等待。
对象上的锁是“递归的”吗? e.如果两个对象在其字段中引用了第三个对象,并且一个线程正在这两个对象之一上运行同步方法,那么任何其他线程都可以访问第三个对象吗?
// a and b are some objects that implement Runnable
// they both reference the same third object
a.ref = c;
b.ref = c;
// a is run in a thread and processes some data in a loop for a long time
// the method the loop belongs to is declared synchronized
threadA = new Thread(a);
threadA.start();
a.someSyncedMethod(); // this would block ...
b.ref.someOtherSyncedMethod(); // ... but would this?
a.ref.someOtherSyncedMethod(); // ... and how about this?
值得将“锁”和“锁定对象”的概念分开。没有真正的“锁定对象”的想法 - 有“获取(和释放)”锁有关联一个东西。是的,这听起来像是我在吹毛求疵——但区别很重要,因为如果你谈论一个object被锁定时,听起来好像在持有该锁时没有其他线程能够更改对象中的任何内容。
相反,它仅意味着在持有锁时没有其他线程能够获取相同的锁。锁与该锁关联的对象的任何内容之间没有直接关系。
声明为“同步”的方法获取与其所属对象的实例关联的锁。这只会使同一对象上的其他同步方法等待,以及在该对象上显式同步的同步语句。
就我个人而言,我不喜欢同步方法 - 我喜欢通过显式同步仅用于同步的(私有、最终)成员变量来使其更清晰。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)