Q31: What is a Volatile variable?
If you are using “volatile” keyword for a variable than Java guarantees every
change on volatile variable will be visible to other thread. It will always
read a variable value from “Main memory” and never from CPU Cache and
Registers. Similarly every write will also be done in “Main memory”. In one line: volatile variables read and
write always happen from Main memory.
thread is doing any operation on a volatile variable, it will always read from
main memory and copy it in CPU cache than process the variable. Once processing
is done immediately flush back from CPU cache to main memory (It always update
main memory, so other thread will read from main memory , latest value).
Q32. What all guarantees java volatile
“volatile variable” gives below guarantee
1. Let’s assume there are two threads
ThreadA and ThreadB. If ThreadsA start writing to volatile variable and has few
other variables in memory and at the same time ThreadB reads the same volatile
variable. Then all variables which were visible to ThreadA before writing the
volatile variable, same variable will be visible to ThreadB after reading
2. Instruction reordering: For performance reason JVM re-order
instructions). So before and after of
volatile variable instructions may re-order, but volatile read and write
instructions can not be re-ordered.
JVM can re-order count1 to count3 only
if writing happens before writing count4 variable. Similarly JVM can re-order
count5 to count7 only if writing happens before count4.
Suppose thread writes count4 from CPU
cache to main memory and it also has other variable like count1 to count3 and
count5 to count7 in memory, then it will also flush these variables to main
Q33. Is volatile guarantees 100% visibility?
Because there is no lock involved. Hence, small time gap while reading and
writing back to main memory can lead to “Race condition”.
Q34. When is volatile good to use?
If only one thread is writing and all other threads just need to read the
variable. Hence, all the reading thread will always read the latest value
written to main memory, and they are not going to change the value, hence no
Q35. Does volatile impact the overall performance?
Yes, because reading from main memory and writing to main memory is always
expensive than reading and writing from CPU cache or registers.
Q36. What is a ThreadLocal?
ThreadLocal as name suggests, they are local to each thread. It cannot be
shared across thread. So whatever read and write happens to ThreadLocal object
it will be visible to only same local thread.
Q36. How you will use ThreadLocal?
ThreadLocal instance can be created as below.
threadLocal = new ThreadLocal();
can set the value in threadLocal as below.
read the value stored in a ThreadLocal like this:
String threadValue =
Q37. What is thread signaling?
: Thread signaling is a way by which thread can communicate with each other.
For thread signaling threads will use a common objects lets say
“CommonObjects”. And thread will call “wait()” ,”notify()” or “notifyAll()”
method to communicate with each other.
Q38. Signaling methods are defined in which class?
As mentioned above all methods “wait()” ,”notify()” or “notifyAll()” are
defined on Object level. Hence, every objects will have these methods. And also
mentioned all thread must be using common object to get signal from each other.
So thread will call these methods on common objects.
Q39. What is the use of “wait()” ,”notify()” or “notifyAll()” ?
: Suppose we have two three threads ThreadA, ThreadB and ThreadC. All needs to
execute below code block (this is not complete code)
ThreadA is executing write() method and
ThreadB are executing read() method. To
entering in synchronized block each thread has first take a lock on common
objects (that is this object, in this case). Let’s assume ThreadB get a lock
and to read the counter value, and ThreadA is waiting for getting lock on this
object to enter write() method. As soon as
ThreadB reaches to this.wait() it will
release the lock and wait for notifications from other thread to return counter
value. Now, ThreadA can get a lock and start writing counter value and once
done it will notify() waiting thread (in
this case ThreadB) and release the lock. As soon as thread get notification it
will process and return the updated counter value.
Q40. Is it necessary to have wait() and notify() calls to be in
Yes, wait(), notify() and notifyAll() can be called from synchronized
block only. They must have a lock on common object. Than only they can call