Multi-Threading
What are different ways in which a thread can enter
the waiting state?
A thread can enter the waiting state by the following
ways:
1. Invoking its sleep() method,
2. By blocking on I/O
3. By unsuccessfully attempting to acquire an object's
lock
4. By invoking an object's wait() method.
5. It can also enter the waiting state by invoking its
(deprecated) suspend() method.
What is the difference between yielding and sleeping?
When a task invokes its yield() method, it returns to
the ready state, either from waiting, running or after its creation. When a
task invokes its sleep() method, it returns to the waiting state from a running
state.
What is mutual exclusion? How can you take care of
mutual exclusion using Java threads?
Mutual exclusion is a phenomenon where no two
processes can access critical regions of memory at the same time. For mutual
exclusion, you can simply use the synchronized keyword and explicitly or implicitly
provide an Object, any Object, to synchronize on. The synchronized keyword can
be applied to a class, to a method, or to a block of code. There are several
methods in Java used for communicating mutually exclusive threads such as wait(
), notify( ), or notifyAll( ). For example, the notifyAll( ) method wakes up
all threads that are in the wait list of an object.
What is the difference between preemptive scheduling
and time slicing?
Under preemptive scheduling, the highest priority task
executes until it enters the waiting or dead states or a higher priority task
comes into existence. Under time slicing, a task executes for a predefined
slice of time and then re-enters the pool of ready tasks. The scheduler then
determines which task should execute next, based on priority and other factors.
What are the states associated in the thread?
A thread is an independent path of execution in a
system. The high-level thread states are ready, running, waiting and dead.
What is deadlock?
When two threads are waiting for each other and can’t
proceed until the first thread obtains a lock on the other thread or vice
versa, the program is said to be in a deadlock.
How does multithreading take place on a computer with
a single CPU?
The operating system's task scheduler allocates
execution time to multiple tasks. By quickly switching between executing tasks,
it creates the impression that tasks execute sequentially.
Is there a separate stack for each thread in Java?
Yes. Every thread maintains its own separate stack,
called Runtime Stack but they share the same memory. Elements of the stack are
the method invocations,
called activation records or stack frame. The
activation record contains pertinent information about a method like local
variables.
Can a lock be acquired on a class?
Yes, a lock can be acquired on a class. This lock is
acquired on the class's Class object.
Why would you use a synchronized block vs.
synchronized method?
Synchronized blocks place locks for shorter periods
than synchronized methods.
What is synchronization?
With respect to multithreading, Synchronization is a
process of controlling the access of shared resources by the multiple threads
in such a manner that only one thread can access a particular resource at a
time. In non synchronized multithreaded application, it is possible for one
thread to modify a shared object while another thread is in the process of
using or updating the object's value. Synchronization prevents such type of
data corruption which may otherwise lead to dirty reads and significant errors.
What is the difference between process and thread?
A thread is a separate path of execution in a program.
A Process is a program in execution.
What is daemon thread and which method is used to
create the daemon thread?
Daemon threads are threads with low priority and runs
in the back ground doing the garbage collection operation for the java runtime
system. The setDaemon() method is used to create a daemon thread. These threads
run without the intervention of the user. To determine if a thread is a daemon
thread, use the accessor method isDaemon()
When a standalone application is run then as long as
any user threads are active the JVM cannot terminate, otherwise the JVM
terminates along with any daemon threads which might be active. Thus a daemon
thread is at the mercy of the runtime system. Daemon threads exist only to
serve user threads.
What’s the difference between the methods sleep() and
wait()?
The sleep method is used when the thread has to be put
aside for a fixed amount of time. Ex: sleep(1000), puts the thread aside for
exactly one second. The wait method is used to put the thread aside for up to
the specified time. It could wait for much lesser time if it receives a
notify() or notifyAll() call. Ex: wait(1000), causes a wait of up to one
second. The method wait() is defined in the Object and the method sleep() is
defined in the class Thread.
What happens when a thread cannot acquire a lock on an
object?
Yes. You can lock an object by putting it in a
"synchronized" block. The locked object is inaccessible to any thread
other than the one that explicitly claimed it. If a thread attempts to execute
a synchronized method or synchronized statement and is unable to acquire an
object's lock, it enters the waiting state until the lock becomes available.
Extending Thread class or implementing Runnable
Interface. Which is better?
You have two ways to do so. First, making your class
"extends" Thread class. The other way is making your class implement
"Runnable" interface. The latter is more advantageous, cause when you
are going for multiple inheritance, then only interface can help. . If you are
already inheriting a different class, then you have to go for Runnable
Interface. Otherwise you can extend Thread class. Also, if you are implementing
interface, it means you have to implement all methods in the interface. Both
Thread class and Runnable interface are provided for convenience and use them
as per the requirement. But if you are not extending any class, better extend
Thread class as it will save few lines of coding. Otherwise performance wise,
there is no distinguishable difference. A thread is in the ready state after it
has been created and started.
What is the difference
between Thread.start() & Thread.run() method?
Thread.start() method (native method) of Thread class
actually does the job of running the Thread.run() method in a thread. If we
directly call Thread.run() method it will executed in same thread, so does not
solve the purpose of creating a new thread.
What happens when I make
a static method as synchronized?
Synchronized static methods have a lock on the class
"Class", so when a thread enters a synchronized static method, the
class itself gets locked by the thread monitor and no other thread can enter
any static synchronized methods on that class. This is unlike instance methods,
as multiple threads can access "same synchronized instance methods"
at same time for different instances.
Can a thread call a
non-synchronized instance method of an Object when a synchronized method is
being executed ?
Yes, a Non synchronized method can always be
called without any problem. In fact Java does not do any check for a
non-synchronized method.
What is Starvation? and What is a
Livelock?
Livelock occurs
when all threads are blocked, or are otherwise unable to proceed due to
unavailability of required resources, and the non-existence of any unblocked
thread to make those resources available. In terms of Java API, thread livelock
can occur in following conditions:
○
When all the threads in a program
execute Object.wait(0) on an object with zero parameter. The program is
live-locked and cannot proceed until one or more threads call Object.notify()
or Object.notifyAll() on the relevant objects. Because all the threads are blocked,
neither call can be made.
○
When all the threads in a program
are stuck in infinite loops.
Starvation describes
a situation where a thread is unable to gain regular access to shared resources
and is unable to make progress. This happens when shared resources are made
unavailable for long periods by "greedy" threads. For example,
suppose an object provides a synchronized method that often takes a long time
to return. If one thread invokes this method frequently, other threads that
also need frequent synchronized access to the same object will often be
blocked.
2. Starvation
occurs when one thread cannot access the CPU because one or more other threads
are monopolizing the CPU.
In Java, thread starvation can be caused by
setting thread priorities inappropriately. A lower-priority thread can be
starved by higher-priority threads if the higher-priority threads do not yield
control of the CPU from time to time.
Can I implement my own start() method?
The Thread start() method is not marked final, but
should not be overridden. This method contains the code that creates a new
executable thread and is very specialised. Your threaded application should
either pass aRunnable type to a new Thread, or extend Thread and override the
run() method.
What's Thread.Join() in threading ?
There are two versions of Thread.Join :-
Thread.join().
Thread.join(Integer)
this returns a boolean value.
The Thread.Join method is useful for determining if a
thread has completed before starting another task. The Join method waits a
specified amount of time for a thread to end. If the thread ends before the
time-out, Join returns True; otherwise it returns False.Once you call Join the
calling procedure stops and waits for the thread to signal that it is done.
Example you have "Thread1" and "Thread2" and while
executing 'Thread1" you call "Thread2.Join()".So
"Thread1" will wait until "Thread2" has completed its
execution and the again invoke "Thread1". Thread.Join(Integer) ensures
that threads do not wait for a long time.If it exceeds a specific time which is
provided in integer the waiting thread will start.
Q.
What is a ThreadLocal class?
A.
ThreadLocal is
a handy class for simplifying development of thread-safe concurrent programs by
making the object stored in this class not sharable between threads. ThreadLocal class
encapsulates non-thread-safe classes to be safely used in a multi-threaded
environment and also allows you to create per-thread-singleton.
Which of the following is true?
a) wait( ),notify( ),notifyall(
) are defined as final & can be called only from with in a synchronized
method : TRUE
b) Among wait( ),notify(
),notifyall( ) the wait() method only throws IOException TRUE
c) wait( ),notify( ),notifyall(
) & sleep () are methods of object class : FALSE as sleep is a
member of Thread class while others are members of Object class
What is a volatile keyword?
Ans)
In general each thread has its own copy of variable, such that one thread is
not concerned with the value of same variable in the other thread. But sometime
this may not be the case. Consider a scenario in which the count variable is
holding the number of times a method is called for a given class irrespective
of any thread calling, in this case irrespective of thread access the count has
to be increased so the count variable is declared as volatile. The copy of
volatile variable is stored in the main memory, so every time a thread access
the variable even for reading purpose the local copy is updated each time from
the main memory. The volatile variable also have performance issues.
No comments:
Post a Comment