Q41. What is the difference between sleep() and wait() method, with
regards to lock?
Ans: When thread calls sleep(),
method it is not necessary to have it in synchronized block. However, if you
are in synchronized block and you call sleep()
method on thread. It will not release the lock. And also note that sleep is a
Thread class method and not a part of “Common object”.
Q42. What is the difference between sleep() , join() and yield()
method of Thread class?
: sleep() : causes the thread to
definitely stop executing for a given amount of time; if no other thread or
process needs to be run, the CPU will be idle (and probably enter a power
yield() method pauses the currently executing
thread temporarily for giving a chance to the remaining waiting threads of the
same priority to execute. If there is no waiting thread or all the waiting
threads have a lower priority then the same thread will continue its execution.
The yielded thread when it will get the chance for execution is decided by the
thread scheduler whose behavior is vendor dependent.
join() If any executing thread t1 calls
join() on t2 i.e; t2.join() immediately t1 will enter into waiting state until
t2 completes its execution.
Q43. What do you mean by missed signals?
It is possible that a thread can miss a signal. Let’s assume there are two
threads ThreadA and ThreadB. ThreadA is going to enter in wait() state and
ThreadB is going to notify(). However, ThreadB notify() ThreadA before ThreadA
enter in wait() block. In this case notify() signal from ThreadB is missed by
ThreadA. Hence, ThreadA remain in wait state forever, which could be a big
problem. Missed signal problem can be avoided using proper code block around
Q44. What is a spurious wakeup?
It is possible because of any surprise reason like hardware issue, thread gets
signal. Lets assume again we have two threads ThreadA and ThreadB , ThreadA is
waiting on notification from ThreadB. However, ThreadA gets notification that
ThreadB has done with its processing. This is a false signal and known as a
spurious wakeup of ThreadA.
avoid spurious wakeup issue, we should check wait state of shared object in
while loop. So in case of false signal it has to check condition on shared
Q45. When should notifyAll() used?
: notifyAll() should be used when many threads are waiting for signal.
Q46. Why we should avoid wait() or getting lock on a Constant strings
or global objects?
: We should avoid Constant String, because JVM internally store different
Constant String with same value as a Single object.
internally stored both the str1 and str2 as two separate reference variable
pointing to single objects in String constant pool. Hence, if two different
threads are working on two different object references can get a wrong/false
problem occurs with globally shared objects.
Q47. What is Thread deadlock?
Deadlock is situation, when two or more threads are blocked and waiting to get
lock on objects. Lets assume there are two threads ThreadA and ThreadB and
there two shared objects obj1 and obj2. ThreadA is holding a lock on obj1 and
also needs lock on obj2 to proceed further. Similarly ThreadB is holding lock
on obj2 and needs lock on obj1 to proceed further. Now both ThreadA and ThreadB
is waiting for each other to release the lock and no one can proceed further.
This situation is called deadlock.
Q48. Why deadlock happens?
Deadlock occurs because two or more threads are waiting for each other locks at
the same time. However, order of getting and releasing lock is not proper it
can arise deadlock.
Q49. How can deadlock be prevented?
to prevent deadlock following techniques can be used
Locks needs to be taken and released in same order by each thread
Lock Timeout and retry: Threads which are waiting to get lock
on threads does not get locks in specified time limit. Then it should release
all the locks it has taken needs to re-try after sometime.
Deadlock Detection: Detect the deadlock and try to avoid.
You can use thread priority as well to avoid deadlock.
Q50. What is thread starvation and what causes it?
Starvation means thread is waiting for infinite time or for longer periods
because of it is not getting lock or CPU time. Following are the reasons for
1. Lower priority thread will never get a
chance, because higher priority threads always exists in application.
2. Thread is waiting for indefinitely,
because it is not able to get lock on thread.