试图了解同步方法

时间:2015-06-19 06:28:41

标签: java multithreading

对于下面的代码,预期输出为:

Waiting for b to complete...
Total is: 4950

为什么它不能在之后打印Total is.. 然后Waiting for b.. ?我认为b.start()在某些情况下可以先执行 ,然后在ThreadB锁定synchronized(this) ThreadB.run() synchronized(b) 1}}因此阻止主要进入public class ThreadA { public static void main(String[] args) { ThreadB b = new ThreadB(); b.start(); synchronized(b) { try{ System.out.println("Waiting for b to complete..."); b.wait(); } catch(InterruptedException e) { e.printStackTrace(); } System.out.println("Total is: " + b.total); } } } class ThreadB extends Thread { int total; @Override public void run() { synchronized(this) { for(int i=0; i<100 ; i++) { total += i; } notify(); } } }

我刚才所说的有什么问题吗?

cdef extern from "foo.h":
    struct A:
        pass
    # or (I've added this bit - not in the documentation directly...)
    ctypedef struct B:
        pass

2 个答案:

答案 0 :(得分:3)

两个输出语句始终具有相同的顺序,因为它们在一个线程上执行。等待另一个线程在它们之间完成不会改变它们的执行顺序。

如果你把&#34; Total is ...&#34;输出到b {'1}}的末尾,那么可能有机会看到输出的不确定性顺序。

编辑 - 请注意@Holger对此答案的评论:

  

[...]在不太可能但仍然可能的情况下,首先执行ThreadB的同步块,其notify()调用将无效,因为没有人等待然后,ThreadA的wait()调用可能会挂起永远不会有后续通知。

答案 1 :(得分:-4)

这里的实际问题是你这里只有一个线程“b”,你在b上调用wait(),它将b线程转换为WAIT状态,并且没有其他线程可以通知这个线程并带回b运行状态。