• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Jeanne Boyarsky
  • Ron McLeod
  • Paul Clapham
  • Liutauras Vilda
Sheriffs:
  • paul wheaton
  • Rob Spoor
  • Devaka Cooray
Saloon Keepers:
  • Stephan van Hulst
  • Tim Holloway
  • Carey Brown
  • Frits Walraven
  • Tim Moores
Bartenders:
  • Mikalai Zaikin

thread question

 
Ranch Hand
Posts: 265
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
hi ,I got it from
http://technoheads.blogspot.com

Consider the following method:
public void getLocks(Object a, Object b)
{ synchronized(a)
{ synchronized(b) { //do something } } }
and the following instantiations:
Object obj1 = new Object();
Object obj2 = new Object();
obj1 and obj2 are accesible to two different threads and the threads are about to call the getLocks() method.Assume the first thread calls the method getLocks(obj1, obj2).
Which of the following is true? Options Select 1 correct option
(1)The second thread should call getLocks(obj2, obj1)
(2)The second thread should call getLocks(obj1, obj2)
(3)The second thread should call getLocks() only after first thread exits out of it
(4)The second thread may call getLocks() any time and passing parameters in any order
(5)None of the above

Answer : 2
Explanation : (1) This may result in a deadlock (3) The is not necessary. Option 2 works just fine.

can anyone explain why the first option would end up in deadlock?

Preparing Scjp1.5
 
Ranch Hand
Posts: 137
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator


Option 1 may result in deadlock because if the second thread is calling getLocks(obj2,obj1) and the first thread is calling getLocks(obj1,obj2)in the following order, deadlock will occur!

thread1 gets the chance to execute and acquires lock on obj1 and assume that immediately thread scheduler has given thread2 priority to run! thread1 will be holding the lock on obj1.
thread2 will start executing and acquires lock on obj2 and then tries to lock object obj1 but its already held by thread1. So it will start waiting for obj1 to be available! And thread2 will be holding the lock on obj2.
after that thread1 gets the chance to execute and tries to lock object obj2
which is held by thread2. it will start waiting for obj2's lock.

Both threads will be waiting for the locks held by each other and they will be keep on waiting...
Hence the deadlock!

Hope you will get it!
 
Preethi Dev
Ranch Hand
Posts: 265
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Thanks Srilatha. I am clear now.
 
reply
    Bookmark Topic Watch Topic
  • New Topic