3 回答
TA贡献1876条经验 获得超5个赞
更一般地解决这个问题......
请记住,使用synchronized on方法实际上只是简写(假设类是SomeClass):
synchronized static void foo() {
...
}
是相同的
static void foo() {
synchronized(SomeClass.class) {
...
}
}
和
synchronized void foo() {
...
}
是相同的
void foo() {
synchronized(this) {
...
}
}
您可以使用任何对象作为锁。如果要锁定静态方法的子集,则可以
class SomeClass {
private static final Object LOCK_1 = new Object() {};
private static final Object LOCK_2 = new Object() {};
static void foo() {
synchronized(LOCK_1) {...}
}
static void fee() {
synchronized(LOCK_1) {...}
}
static void fie() {
synchronized(LOCK_2) {...}
}
static void fo() {
synchronized(LOCK_2) {...}
}
}
(对于非静态方法,您可能希望将锁定为非静态字段)
TA贡献2012条经验 获得超12个赞
static synchronized意味着对类的Class对象 synchronized持有锁定,这意味着锁定该类的对象本身。这意味着,如果要访问(执行)线程中的非静态同步方法,您仍然可以使用另一个线程访问静态同步方法。
因此,不可能在任何时间点通过多个线程访问两种相同类型的方法(两种静态方法或两种非静态方法)。
添加回答
举报