简单Java并发问题

简单Java并发问题,java,concurrency,synchronization,Java,Concurrency,Synchronization,线程1: if(!conditionFullfiled) this.wait(); 线程2: if(conditionFullfiled) thread1.notify(); 当某个条件已满时,我想从线程2唤醒线程1。但是当调用thread1.notify()时,如果(!conditionfullfield)***此处***this.wait(),是否有问题?您使用什么对象作为“this”?如果在thread1对象上调用wait(),并且所显示的两条语句都包装在如下循环中: 然后,您的代码将

线程1:

if(!conditionFullfiled) this.wait();
线程2:

if(conditionFullfiled) thread1.notify();
当某个条件已满时,我想从线程2唤醒线程1。但是当调用
thread1.notify()
时,如果(!conditionfullfield)***此处***this.wait(),是否有问题

您使用什么对象作为“this”?如果在thread1对象上调用wait(),并且所显示的两条语句都包装在如下循环中:

然后,您的代码将按您想要的方式工作。(当条件为false时,第一个线程将停止,否则将工作)。 诀窍在于线程对象上的交互是同步的,因此一个线程不能在另一个线程处理该对象时中断

编辑:
如果您不在线程上同步,而是在其他对象上同步(您可以简单地创建纯对象来提供锁),那就更好了。

没有问题,因为等待释放对象锁(在这种情况下)

最好的做法是在while块中保护等待/通知条件,以避免虚假唤醒。

要执行
obj.wait()
obj.notify()
,您需要拥有要等待/通知的对象的监视器。在代码中,可能不需要thread1.notify()。例如:

   Object someSharedObject = ...
线程1:

   synchronized(someSharedObject) {
     // while NOT if for spurious wake ups.
     while(!conditionFullfiled) someSharedObject.wait();
   }
线程2:

   synchronized(someSharedObject) {
     if(conditionFullfiled) someSharedObject.notify(); // this wakes thread1
   }
synchronized
锁位于
someSharedObject
(可以是
this
),这意味着两个线程永远不会冲突
.wait()
释放当前保留的监视器,因此当Thread1正在等待时,Thread2不会被阻止

编辑:我学到了一些关于虚假唤醒的知识。
.wait()
必须在
循环中执行,而
循环-
如果
不够。谢谢恩诺·绍吉教我


编辑:澄清
.wait()
释放监视器。

这里有两个问题

  • 您不应该对线程对象本身调用wait()和notify()。更好的方法是使用特殊的锁对象,例如

    私有对象锁=新对象(); ...... lock.wait()

  • 下一个问题是,必须将wait()和notify都调用到synchornized块中,即

    同步(锁定){ //一些代码 lock.wait(); }

  • 然后在代码的其他地方说:

    syncronized(lock) {
        lock.notify(); // this line will cause the wait to terminate and the first thread to continue.
    }
    
    可以方便地将
    wait()
    notify()
    包装方法本地化到一个类中,这样它们就可以访问lock对象

    欲了解更多信息,请阅读
    http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html
    if
    应替换为
    while
    以应对虚假唤醒。
    someSharedObject.wait()
    在同步块内被调用-如果Thread1已经在等待,这难道不意味着Thread2永远不会进入另一个同步块吗?@fhucho,
    wait()
    释放当前持有的监视器。@Martin:“真的没有任何东西会随机唤醒线程”根据规范,有。。。我认为
    wait()
    的API文档应该警告这一点@Martin Algesten谢谢,请您再补充一点,wait()会释放所有监视器?
    syncronized(lock) {
        lock.notify(); // this line will cause the wait to terminate and the first thread to continue.
    }