了解多线程

Ari*_*ule 5 java multithreading

关于并发运行的线程以及它们对对象的锁定,我只是有一个问题.据我所知,调用wait()方法的线程将进入等待列表,并允许来自阻塞列表的另一个线程接管锁定和对象(在同步代码中).如果现在对该对象具有锁定的此线程调用notify()方法,则它会唤醒调用wait()的线程,并将其移动到阻止列表.

调用notify()方法的线程会发生什么.它是否仍然锁定对象或现在是否在等待列表?

问候

Jes*_*per 5

只有一个线程可以保持对象的锁定.在wait()notify()而线程持有调用这些方法的对象上的锁方法必须被调用; 如果他们不这样做(例如,因为你没有在对象上同步),你会得到一个IllegalMonitorStateException.

当你调用时wait(),线程放弃锁定并进入等待列表(停止执行).当wait()返回时,该线程将再次获得锁.但是,调用的线程notify()仍然保持锁定,因此等待线程将不会在通知线程退出synchronized块或方法之前恢复,以便释放对象的锁定.

通过调用notify()线程不会放弃对象的锁定.

一系列可能的事件将是:

  • 线程1进入一个synchronized块,获得对象的锁定
  • 线程1调用wait()对象,放弃锁定,停止执行
  • 线程2进入一个synchronized块,获得对象的锁定
  • 线程2调用notify()该对象,但仍保持锁定
  • 线程1被唤醒并尝试获取锁定,但它不能,因为线程2仍然拥有它(因此线程1必须等待锁定)
  • 线程2退出synchronized块并释放锁定
  • 线程1现在可以获取锁定并从中返回 wait()