并发读取只读字段并写入共享对象中的 read/write 字段
Concurrent reads from read only fields and writes in read/write fields in a shared object
假设我有这个 class:
public SharedObject {
private int readOnlyField;
private int readWriteField;
public SharedObject(int field1, int field2) {
this.readOnlyField = field1;
this.readWriteField = field2;
}
public getField1() {...}
public synchronized getField2() {...}
public synchronized setField2(...) {...}
}
我可以让多个线程同时使用这 3 个方法吗?
显然我可以使用最后 2 个同步方法,但我不确定 getField1() 是否可以与其他 2 个同时执行。
我认为答案是肯定的,但只是为了确定我是否遗漏了一些细微之处。
是的。其他线程可以执行未 标记为同步的函数 。
因此,在您的情况下:
没有两个线程可以同时执行 getField2
和 setField2
。但是 getField1()
可以与 getField2
或 setField2
同时执行
对于getField1
它可以由2个线程同时执行,无需任何等待和同步。并且由于您没有任何 setter,并且它的值是在对象实例化时初始化的,所以脏读也没有变化。
对于getField2
和setField2
,没有2个线程并且同时对SharedObject
的同一个实例执行这些方法。
希望对您有所帮助!!!
假设我有这个 class:
public SharedObject {
private int readOnlyField;
private int readWriteField;
public SharedObject(int field1, int field2) {
this.readOnlyField = field1;
this.readWriteField = field2;
}
public getField1() {...}
public synchronized getField2() {...}
public synchronized setField2(...) {...}
}
我可以让多个线程同时使用这 3 个方法吗?
显然我可以使用最后 2 个同步方法,但我不确定 getField1() 是否可以与其他 2 个同时执行。
我认为答案是肯定的,但只是为了确定我是否遗漏了一些细微之处。
是的。其他线程可以执行未 标记为同步的函数 。
因此,在您的情况下:
没有两个线程可以同时执行 getField2
和 setField2
。但是 getField1()
可以与 getField2
或 setField2
对于getField1
它可以由2个线程同时执行,无需任何等待和同步。并且由于您没有任何 setter,并且它的值是在对象实例化时初始化的,所以脏读也没有变化。
对于getField2
和setField2
,没有2个线程并且同时对SharedObject
的同一个实例执行这些方法。
希望对您有所帮助!!!