代码之家  ›  专栏  ›  技术社区  ›  G Vaid

同步对象:锁定代码与锁定对象

  •  1
  • G Vaid  · 技术社区  · 9 年前

    假设您有两个线程可以访问同一公共对象。一个线程有一个读取对象字段的代码块。

    synchronized(object)
    {
        read object fields
    }
    

    当读取的对象字段代码在线程1中执行时,如果线程2想要更新对象的字段,它是否必须等到线程1读取完对象的字段后才更新(例如,在同步代码块执行时,对象是否被其他线程锁定而无法访问)?

    3 回复  |  直到 9 年前
        1
  •  1
  •   Mureinik    9 年前

    同步对象不会以任何方式“锁定”它。除非以相同的方式同步更新对象的字段,否则它可能很好地与您在这里介绍的读取代码交织。

        2
  •  0
  •   Tamas Hegedus    9 年前

    不,第二个线程不会等待,除非它有 synchronized 块也在同一个对象上。

    synchronized(object)
    {
        // read object fields
    }
    
    ... in other thread:
    
    synchronized(object)
    {
        // write object fields
    }
    
        3
  •  0
  •   11thdimension    9 年前

    同步块只保护其中的代码。所以,若两个或多个线程试图在同步块内运行代码(由同一对象监视器保护),它们将以独占方式执行。这意味着,如果一个线程已经进入同步块,其他线程将不得不等待,直到它退出。

    同步块无论如何都不会锁定对象,它只是使用对象的监视器来保护其中的代码。如果要使对象线程的方法安全,那么必须声明它们是同步的。

    synchronized getField()
    synchronized setField()
    

    现在,多个线程可以安全地调用getField()和setField)。

    然而,使用synchronized会带来性能成本,您可以尝试在中使用Locks或Atomic类 java.util.concurrent.atomic 例如AtomicInteger、AtomicBoolean或AtomicReference。