Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 共享对象中只读字段的并发读取和读/写字段的并发写入_Java_Multithreading_Synchronization - Fatal编程技术网

Java 共享对象中只读字段的并发读取和读/写字段的并发写入

Java 共享对象中只读字段的并发读取和读/写字段的并发写入,java,multithreading,synchronization,Java,Multithreading,Synchronization,假设我有一门课: public SharedObject { private int readOnlyField; private int readWriteField; public SharedObject(int field1, int field2) { this.readOnlyField = field1; this.readWriteField = field2; } public getField1() {...} public sy

假设我有一门课:

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
,它可以由两个线程同时执行,而无需任何等待和同步。由于您没有任何setter,并且它的值是在对象实例化时初始化的,所以也不会更改脏读

对于
getField2
setField2
,没有两个线程同时对
SharedObject
的同一实例执行这些方法


希望这有帮助

当然可以。检查一下,如果这没有帮助,我稍后会发布一个更全面的答案。事实上,getField2和setField2不能由两个线程同时执行。这是synchronized关键字的定义。没有,但是在第二次阅读时,我可能不理解你的最后一句话。你能详细说明一下吗?这种情况不可能发生,因为两个相同的实例必须具有相同的锁。它们是相同的。如果没有同步,那么执行时就不需要对象的锁,但是如果有同步,那么线程将获取该对象/实例的锁,这意味着如果任何其他线程想要获取相同的对象锁,那么它必须等待。现在,可能会有两个线程需要锁,如果优先级不同,那么优先级较高的线程将首先获得锁,如果优先级相同,则首先获得锁,或者基于JVM。若对象不一样,那个么这一切都不会出现在画面中,因为这一切都是关于同一对象的锁定。是的,我的陈述变得混乱。我编辑。谢谢