File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
The moose likes Programmer Certification (SCJP/OCPJP) and the fly likes notify() question from Nikos Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login

Win a copy of Java Interview Guide this week in the Jobs Discussion forum!
JavaRanch » Java Forums » Certification » Programmer Certification (SCJP/OCPJP)
Bookmark "notify() question from Nikos" Watch "notify() question from Nikos" New topic

notify() question from Nikos

Nidhi Sar
Ranch Hand

Joined: Oct 19, 2009
Posts: 252


This is a question from Niko's on Threads. What is the result of the following code:

The possible choices are:
a. It prints 0.
b. It prints 999999.
c. The output is not guaranteed to be any of the above.

The answer is choice b.

But b is guaranteed only if line 1 executes before line 2 and the main thread gets the lock on thread object BEFORE the second thread. That cannot be guaranteed. If the reverse happens & line 2 executes first, the program will basically hang at thread.wait() [since notify() has already happened, and wait() doesn't know that].

So shouldn't the answer be choice c?

"A problem well stated is a problem half solved.” - Charles F. Kettering
Ankit Garg

Joined: Aug 03, 2008
Posts: 9466

Seems a valid reason to me. To get a guaranteed behavior, the thread.start() statement should be inside the synchronized block in main method...

SCJP 6 | SCWCD 5 | Javaranch SCJP FAQ | SCWCD Links
Venu Chakravorty
Ranch Hand

Joined: Aug 19, 2009
Posts: 46
Taken from K & B (SCJP 1.6) page no.: 748 and 749:

This program contains two objects with threads: ThreadA contains the main
thread and ThreadB has a thread that calculates the sum of all numbers from 0
through 99. As soon as line 4 calls the start() method, ThreadA will continue
with the next line of code in its own class, which means it could get to line 11
before ThreadB has finished the calculation. To prevent this, we use the wait()
method in line 9.

Even it is stated that "As soon as line 4 calls the start() method, ThreadA will continue with the next line of code in its own class...". What I do not understand is, how can we be so sure?
I agree. Here's the link:
subject: notify() question from Nikos
It's not a secret anymore!