本文共 677 字,大约阅读时间需要 2 分钟。
Synchronized修饰非静态方法和静态方法在Java中的行为有显著不同。以下是详细解释:
Synchronized修饰非静态方法:
- 作用:对每个对象实例施加锁,确保同一时间只有一条线程访问该对象的方法。
- 情况分析:
- 同一对象的多个同步方法:如a.isSyncA()与a.isSyncB(),会产生互斥,因为它们使用同一对象锁。
- 不同对象的同步方法:如a.isSyncA()与b.isSyncA(),不会互斥,因为每个对象有自己的锁。
Synchronized修饰静态方法:
- 作用:对类对象施加锁,确保同一时间只有一条线程访问该类的静态方法。
- 情况分析:
- 同一类的多个静态同步方法:如cSyncA()与cSyncB(),会互斥,因为它们使用同一类锁。
- 不同对象调用同一类的静态方法:如x.cSyncA()与y.cSyncB(),会互斥,因为它们使用同一类锁。
- 不同类的静态方法:如x.cSyncA()与y.dSyncA(),不会互斥,因为它们使用不同的类锁。
示例分析:
- 选项a:a.isSyncA()与a.isSyncB() - 同一对象的同步实例方法,互斥。
- 选项b:a.isSyncA()与y.isSyncA() - 不同对象的同步实例方法,不互斥,可同时访问。
- 选项c:x.cSyncA()与y.cSyncB() - 同一类的静态方法,互斥,不可同时访问。
- 选项d:x.isSyncA()与Something.cSyncA() - 不同锁类型,不互斥,可同时访问。
结论: 选项b和d可以被同时访问,而选项a和c则不行。正确答案是选项b和d。
转载地址:http://hruyz.baihongyu.com/