在同步方法中等待与不等待(java)

时间:2016-10-18 06:04:45

标签: java multithreading if-statement concurrency wait

您好我是Java的新手,现在我正在进入Java并发。我对同步方法有点怀疑:我已经看到我可以在Synchronized方法中使用If else获得相同的结果,每次检查如果执行操作的条件是满的,就像使用wait / notify方法一样。

由于我得到了相同的结果,我想知道If else方法是否比等待和通知方法有任何优点或缺点?我认为效率将是一个劣势,因为如果总是检查条件,谁等待只是停止并等待通知。但是还有其他优点或缺点吗?

THX!

2 个答案:

答案 0 :(得分:1)

你混合了两个概念。 If-Else vs Wait-Notify完全不同。您希望两个线程与每个其他进行通信,这是使用Wait-Notify的地方,而if-else是一般条件语句。

不能让两个线程只使用if-else条件相互通信。您可以编写使其看起来像它的代码但是您不允许线程彼此交互。

此外,它可能导致不良后果/计算状态。迟早你会有hotchpotch代码。

答案 1 :(得分:1)

synchronized块使代码线程安全。如果您想提高效率,可以使用wait()notify()notifyAll()

例如,如果您的共享资源是一个列表,则多个线程共享。如果将它放在监视器的synchronized块中,则在上下文切换期间,线程将不断地跳入并运行代码。即使列表很简单!!

wait()因此在监视器(synchronized(..)内部的对象)上使用notifyAll()作为一种机制来告诉'所有线程都要放松并停止使用CPU周期,直到另行通知或synchronized(monitor) { while( list.isEmpty() ) monitor.wait(); doSomething(...) }

doSomething()

在上面的示例中,notify()将在列表不为空时执行 ,在另一个线程执行notifyAll()synchronized(monitor) { if(!list.isEmpty()) doSomething(...) } 之后执行码。

,代码如下:

doSomething()

当一个线程进入同步块时,有三种可能的情况:

  1. 该列表为空:doSomething()将不会被执行。
  2. 列表不为空:if可以正确执行,或者......
  3. 如果在doSomething之后和doSomethig()之前有一个上下文切换,而另一个线程将所有列表的项目取出,则在另一个上下文切换线程之后将执行{{ 1}}在空列表上。
  4. 所以,只是为了总结一切,如果你使用wait / notify,你保证更高效的代码!线程在他们不需要时不起作用。