Home  >  Blog  >   Java  > 

Java Concurrency Interview Questions

Are you someone who is going to sit for java interviews? Or are you going to sit for investment banking interviews? Then you should anticipate a lot of concurrency and multithreading interview questions if you're going to any Java interview. But you need not worry. We've got your back. We have bundled Java Concurrency questions for freshers, professionals, interviewers, and interviewees. But before knowing about that, you should know a bit about Java.

Rating: 4.5
  
 
227

Java is a widely used, high-level, object-oriented, class-based programming language that is designed to have lower implementation dependencies as possible. It was first introduced 27 years ago, on May 23, 1995. Today it functions in billions of devices, from computers and mobiles to medical devices. Java is different from other programming languages because other programming languages only utilize one, which may be a compiler or an interpreter. But Java uses both a compiler and an interpreter. Python solely uses the interpreter, whereas C and C++ only use the compiler to compile their programs. Java employs both a compiler and an interpreter, using the compiler first and then the latter.

Java concurrency ensures that we can do some activities more quickly by breaking them down into smaller tasks. These subtasks are then carried out synchronously. Concurrency in Java is one of the trickiest and most complicated subjects brought up in technical interviews.

This blog has covered the top-most interview questions in three categories:

  1. Freshers
  2. Experienced
  3. FAQs

Top 10 Java Concurrency Interview Questions:

  1. Describe Semaphore in Java Concurrency.
  2. In Java, what exactly is a volatile variable?
  3. FutureTask Class: What is it?
  4. What does Java's fork-join framework do?
  5. What is the JMM (Java Memory Model)? Describe Its objective and core principles.
  6. What does Java's ThreadLocal variable mean?
  7. Describe the Executors Framework.
  8. What are concurrency and parallelism?
  9. What is the concurrency framework in Java?
  10. What is a deadlock in concurrency?

Java Concurrency Interview Questions For Freshers:

1. Describe Semaphore in Java Concurrency.

A class called Semaphore can be found in the Java.util concurrent package. It functions essentially as a semaphore that keeps track of permissions.

The thread uses the acquire() function to obtain permissions to access the shared resource. At the same time, the count value of the Semaphore will be reduced by one and given a permit if it is not equal to 0. If not, the thread will be stopped until it's permitted. When a thread is finished accessing a shared resource, it releases it by using the release() method. 

Semaphore in Java Concurrency

2. What distinguishes Java's CyclicBarrier from CountDownLatch?

The key distinction between CyclicBarrier and CountDownLatch, despite the fact they both wait for several threads on one or more events, is that although you cannot reuse CountDownLatch after the count reaches zero, you can do so with CyclicBarrier even after the barrier has been broken.

3. What distinguishes a thread from a process?

Thread: It refers specifically to the minuscule components of the specific process. It can run many threads or sections of the program simultaneously.

Process: This term simply denotes an active program that is currently running. PCB can be used to manage a process (Process Control Block).

4. What differentiates the Thread class's start() and run() methods?

While the start() function internally calls the run() method, there is a distinction. when calling the run() method directly.

Unlike when you call the start() function, when you call run() as a regular method, the thread in which it is called remains the same.

5. What distinguishes a class lock from an object lock?

Class Lock: Every class in Java has its specific lock, known as a class-level lock. Static data can be made thread-safe by achieving these locks with the keyword "static synchronized." When one wants to stop many threads from entering a synchronized block, one typically utilizes this technique.

Object Lock: In Java, every single object has its lock, which is typically referred to as an object-level lock. These locks, which secure non-static data, are created by using the term "synchronized." It is typically used for synchronizing non-static methods or code blocks so that only the thread can run the code at a specific instance of the class.

Looking forward to becoming a master in "Programming & Frameworks Courses"? Check out the "Core Java Training" and get certified today.

6. What are the terms Executor and Executorservice? What contrasts exist between these interfaces?

The Java.util.concurrent framework's Executor and ExecutorService interfaces are linked. With only one execute method that accepts Runnable instances, the Executor interface is incredibly straightforward. Your task-executing code should typically be dependent on this interface.

ExecutorService adds more methods to the Executor interface for handling and monitoring the lifecycle of a concurrent task execution service (such as methods for terminating tasks in the event of shutdown) as well as ways for handling more advanced asynchronous tasks like Futures.

7. In Java, what exactly is a volatile variable?

Only instance variables may be used with the unique modifier volatile. In the absence of any synchronizer like synchronized keywords or locks, changes done by many threads on instance variables in concurrent Java programs are not visible to others.

As indicated in the preceding question, the "volatile variable rule" ensures that a write occurs before any ensuing read.

8. What various stages of a thread's lifecycle are there?

In a Java program, a thread's status is New when it is first created. The thread that changed its state to Runnable is then started. It is up to the thread scheduler to give threads in the runnable thread pool CPU time and set their status to running. Waiting, blocking, and death are more thread states.

Various Stages of a Thread's LifeCycle

9. What are the steps for starting and running a Thread instance?

You have two choices for establishing a thread instance. To begin, the call starts on a Runnable instance and feeds it a parameter (). It is possible to pass a lambda expression as Runnable has a functional interface.

You can start a thread by creating an anonymous subclass, overriding the run() function, and then calling start. Thread also implements Runnable ().

 MindMajix YouTube Channel

10. What distinguishes Runnable from Callable in Java?

Runnable and Callable both represent tasks that are meant to be carried out on distinct threads. Runnable has existed since JDK 1.0, whereas Callable was introduced in JDK 1.5. The primary distinction among these two is that Callable's call() method can both return value and throw an exception, whereas Runnable's run() method could not. Callable return Future object, which can include the calculation's result

11. Could One of These Threads Block If Two Threads Call a Synchronized Method on Various Object Instances at the Same Time? What Happens If the Process Is Static?

When a method is an instance method, the instance serves as a method monitor. No one gets stopped since two threads invoking the procedure on different instances obtain different monitors.

The class object is the monitor if the procedure is static. Since the monitor is the same for both threads, one of them will likely block and wait for the other to exit the synchronized procedure.

12. FutureTask Class: What is it?

We can utilize Executors and FutureTask, the base implementation class for the Future interface, for asynchronous processing. Although we don't usually need to utilize the FutureTask class, it is quite useful if we want to override a few of the Future interface's functions while keeping the majority of the base implementation. Simply extending this class will allow us to override the methods to meet our needs.

What is FutureTask Class

Java Concurrency Interview Questions For Experienced:

1. What constitutes a volatile field, and what all guarantees could the JMM hold for such a field?

According to the Java Memory Model, a volatile field has unique characteristics. A volatile variable's reads and writes are synchronization operations, which means they have a complete ordering (all threads will be observing a compatible order of these actions). It is guaranteed that a read of a volatile variable will reflect the order of the last write to the variable.

There is little assurance as to what a certain thread might read from a field that is accessed by numerous threads and has at minimum one thread writing to it; thus, you should think about making it volatile.

Atomicity of 64-bit values when writing and reading is another assurance of volatility (long and double). A read of such a field without a volatile modifier could reveal a value that had been partially written by another thread.

2. What does Java's fork-join framework do?

Java developers can use the fork-join framework, which was made available in JDK 7, to make use of the numerous processors seen in contemporary servers. It is made for work that can be repeatedly divided into smaller tasks.

Utilizing every bit of processing power at your disposal will improve the efficiency of your application. The fork/join framework's usage of a work-stealing mechanism is one of its key advantages. When a worker thread runs out of work, other active threads may be able to take over its job.

Java's fork-join framework

3. Describe the Fork/Join Framework's Objectives and Use-Cases.

Recursive algorithms can be parallelized using the fork/join framework. The biggest issue with utilizing a tool like ThreadPoolExecutor to parallelize recursion is that you might end up running out of threads because each recursive step would demand its thread, whereas the threads up the stack may become idle and waiting.

The ForkJoinPool class, which is an implementation of ExecutorService, serves as the entry point for the fork/join framework. The work-stealing technique is implemented, in which idle threads attempt to "take" work from active threads. This makes it possible to use fewer threads than would be necessary with a typical thread pool and spread the calculations across several threads.

4. What enhancements have been made to the Java 8 Concurrency API?

Concurrent API improvements that are significant include:

ConcurrentHashMap has methods for computing, forEach, for each entry, for each key, for each value, merge, reduce, and search.

Future that is explicitly able to be completed (setting its value and status).

Executors use the newWorkStealingPool() function to construct a work-stealing thread pool with the goal parallelism level set to all available processors.

5. T1, T2, and T3 are the three threads. How do you assure the Java sequence T1, T2, and T3?

The join() method of the Thread class can be used to start a thread when another one has completed its execution. Sequencing in multithreading can be accomplished in various ways. The last thread, T3, needs to be started first, followed by the other two using the join methods in reverse order, T3 calling T2.join, T2 calling T1.join, such that T1 will complete first and T3 will finish last. This will ensure that three threads execute.

6. What is the JMM (Java Memory Model)? Describe Its objective and core principles.

A section of the Java language specification is the Java Memory Model. It describes how data changes performed by one thread are made apparent to other threads and how numerous threads in a concurrent Java application access common memory. Despite being brief and to the point, JMM could be difficult for those without a solid mathematical foundation to understand.

The necessity for a memory model results from the fact that data access in Java code differs from how it occurs at lower levels. As long as the observable outcome of these reads and writes is the same, the Java compiler, JIT compiler, and even the CPU may rearrange or optimize memory writes and reads.

JMM (Java Memory Model)

This can provide unexpected outcomes when your application is scaled to multiple threads because the majority of these optimizations only consider the execution of a single thread (the cross-thread optimizers are extremely tough to implement). Modern systems have tiered memory, which is a big concern since different processor cores may hold certain non-flushed data in their caches or read/write buffers, which also impacts how the memory is seen by other cores.

Even worse, Java's promise of "write once, execute everywhere" would be broken by the existence of various memory access architectures. The JMM establishes some assurances that you may rely on when creating multithreaded programs, which is good news for programmers. Programmers can create multithreaded code that is reliable and cross-platform by adhering to these criteria.

The key ideas behind JMM are:

  1. Reading or writing variables, locking or unlocking monitors, and other inter-thread operations fall under the category of synchronization operations. Actions are a subset of these operations, such as reading or writing volatile variables or locking or unlocking monitors.
  2. The visible overall sequence of events inside a single thread is called "Program Order" (PO).
    If two synchronization actions occur one after the other in Program Order (PO), they must also occur in the same order in Synchronization Order (SO), which is the overall order of all synchronization actions. Examples of such synchronization actions include unlocking a monitor and locking the same monitor (in another or the same thread)
  3. Happens-before Order creates a partial ordering of all inter-thread operations by combining PO and SW, which is known as transitive closure in set theory. If one action occurs before another, the second action will show the effects of the first action (for example, write of a variable in one thread whereas reading in another)
  4. Every read must be aware of the most recent write to that location in the happens-before order or some other writing via data for a series of operations to be Happens-Before Consistent (HB). race
  5. Execution refers to a collection of coordinated actions and the rules that must apply to them.

We can see numerous distinct executions of a given program with varying results. The multithreaded program can be thought of as a set of operations taking place in some sequential sequence if it is properly synchronized, in which case all of its executions appear to be sequentially consistent. This spares you from having to consider internal data caching, optimizations, or reorderings.

7. Define Thread-safety. Is Vector a thread-safe class?

A quality of an object or of a piece of code called "thread safety" ensures that it will perform as expected if it is used by more than one thread, whether it be reading or writing. When the same instance of a counter is shared by different threads, for instance, a thread-safe counter object won't miss any counts.

There is also a thread-safe and non-thread-safe division of collection classes. Although its sibling ArrayList is not thread-safe, the class Vector is thread-safe and achieves this through synchronizing methods that modify Vector's state.

8. What are the possible and available implementations of Executorservice in the standard Library?

There are three standard implementations of the ExecutorService interface. They are:

  1. ThreadPoolExecutor- For employing a pool of threads to complete tasks, use the ThreadPoolExecutor. A thread returns to the pool after completing the work at hand. The task must wait for its turn if every thread in the pool is busy.
  2. ScheduledThreadPoolExecutor- When a thread is available, the ScheduledThreadPoolExecutor allows for task scheduling rather than instant execution. Additionally, tasks with a fixed rate or defined delay can be scheduled.
  3. ForkJoinPool- It is a unique ExecutorService designed to handle jobs involving recursive algorithms. You will rapidly discover that all of your threads are occupied while waiting for the lower levels of recursion to complete if you use a normal ThreadPoolExecutor for a recursive process. The so-called
  4. work-stealing mechanism, which the ForkJoinPool implements, enables it to utilize available threads more effectively.

9. What does Java's ThreadLocal variable mean?

Java programmers have access to a unique category of variables called ThreadLocal variables. The ThreadLocal variable is per thread, just like the instance variable is per instance. It's a handy approach to provide thread safety for expensive-to-generate objects. For instance, you can use ThreadLocal to make SimpleDateFormat thread-safe. It's not a good idea to utilize that class in local scope because it necessitates distinct instances for each invocation and is pricey.

You can kill two birds with one stone by giving each thread a copy. By employing a fixed number of instances, you could decrease the number of instances of expensive objects while also achieving thread safety without having to pay for synchronization or immutability.

One more perfect example of a thread-local variable can be the ThreadLocalRandom class, which decreases the number of instances of expensive-to-create Random objects in a multithreading instance.

10. What is the Interrupt flag for the thread? How might you set and check it? What relationship has it to the InterruptedException?

When a thread is interrupted, a thread internal flag called the interrupt flag, also known as the interrupt status, is set. Call thread. interrupt() on the thread object to set it.

This function immediately throws InterruptedException if a thread is currently executing one of the waits, join, sleep, etc., methods that throw InterruptedException. The thread is unrestricted in how it chooses to handle this exception.

Nothing extraordinary occurs if the thread. interrupt() is called while a thread is not inside such a procedure. Using the static thread. interrupted() or instance interrupted() methods, it is the responsibility of the thread to verify the interrupt state regularly. The distinction between these two methods is that interrupted() does not clear the interrupt flag while static thread.interrupted() does.

11. Explain the many states of a thread and when the state transitions take place.

The "Thread.getState()" method can be used to determine a Thread's current status. The "Thread.State" enum contains descriptions of various Thread states as follows:

  1. NEW- A fresh Thread instance that hasn't yet been launched by calling thread.start()
  2. RUNNABLE- A running thread is a RUNNABLE. It is referred to as runnable because it may be either running or waiting for the next chunk of time from the thread scheduler at any one time. When Thread. start() is called on a NEW thread, it moves into the RUNNABLE state.
  3. BLOCKED- A running thread is considered to be blocked if it needs to gain entry to a synchronized section but is unable to do so because another thread is holding the section's monitor.
  4. WAITING- A thread enters the WAITING state when it waits for yet another thread to complete a task. A thread might reach this state by invoking the thread.join() method on another thread or the object.wait for () function on a monitor it is holding, for example.
  5. TIMED WAITING is identical to the previous state, except a thread enters it by invoking timed versions of the methods Thread.sleep(), Object.wait(), Thread.join(), and others.
  6. TERMINATED- This indicates that a thread has finished running its Runnable. run() method and has ended.

12. Describe the Executors Framework.

The java.util.concurrent.The executor interface debuted with Java 5, introducing the Executor framework.

According to a series of execution policies, the Executor framework standardizes the invocation, execution, scheduling, control of asynchronous jobs, and execution.

The application may run out of heap memory if there are too many threads created with no limits on the maximum threshold. Due to the ability to pool and reuse a limited number of threads, constructing a ThreadPool is a superior approach. Java's Executors Framework makes it easier to create Thread pools.

Would you like to ace Core Java job interviews? Top Core Java Interview Questions from MindMajix are exclusively for you!

Frequently Asked Java Concurrency Interview Questions and Answers:

1. What makes a Java Application Concurrent?

You must create a concurrent Java class in the first class, which is Java.lang.Thread class. The foundation of all Java concurrency topics in this class. The following is Java.lang.Runnable interface for abstracting thread behaviour from the thread class.

Other classes you will need to create advanced applications can be found at Java.util.concurrent package integrated into Java 1.5.

2. What are concurrency and parallelism?

In computer programming, parallelism refers to the simultaneous execution of many (possibly related) operations, whereas concurrency refers to the conjunction of independently running processes. Dealing with multiple issues at once is what concurrency is about. It involves carrying out several tasks at once.

3. What is concurrency in Java, for example?

The ability to perform multiple programs or applications parallel is known as concurrency. Threads are the foundation of Java concurrency (an efficient process that can access shared data from other threads in the same process and has its files and stacks.).

4. Why is concurrency used in Java?

By using the incredible potential of the underlying operating system and machine hardware, concurrency allows a program to attain high performance and throughput.

5. Is concurrency the same as multithreading?

To make the most of a CPU, multithreading is a technique that enables the concurrent (simultaneous) execution of two or more sections of a program. Multithreading enables concurrency, which is the program's capacity to handle (rather than perform) multiple tasks at once. Concurrency should not be confused with parallelism, which involves carrying out many tasks at once.

6. What is the concurrency framework in Java?

The Java Concurrency utility framework is a library of types that can be used to develop concurrent classes or programs. These types provide exceptional performance, are thread-safe, and have undergone extensive testing.

7. What is multithreading in Java?

Multithreading in Java is the concept of running two or more threads concurrently to make the most of the CPU. In Java, a thread is a lightweight procedure that uses fewer resources to build and distribute the process resources.

Multithreading in Java

8. Is Java multithreaded by default?

Java may be used to create multithreaded programs because it is a multithreaded programming language. A multithreaded application includes two or more components that can operate simultaneously, and each component can do a distinct task at the same time while utilizing the resources to the fullest extent possible, especially when your machine has multiple CPUs.

9. What is a deadlock in concurrency?

When two or more threads are stuck waiting for each other indefinitely, the condition is referred to as a deadlock. When several threads need the same locks but acquire them in different orders, a deadlock occurs. Because the synchronized keyword forces the executing thread to block while waiting for the lock, or monitor, attributed to the particular object, a Java multithreaded program may experience the deadlock condition.

Deadlock in concurrency

10. What maximum thread priority does Java provide?

The priority of a thread in Java is an integer in the range of 1 to 10. The priority increases with the size of the number. This integer from each thread is used by the thread scheduler to decide which one should be permitted to run.

Conclusion

Java is one of the most demanding programming languages. It takes its basic structure from C & C++. Any field that includes Java in its core understands the value of this language and the need for competition in it. Java concurrency is one of the most tricky and challenging topics of Java as it also goes hand-in-hand with multithreading and parallelism. Any interviewer related to Java will surely ask questions about this topic. We hope that our Java Concurrency Interview Questions have helped you to gain an understanding of the importance of this topic.

Join our newsletter
inbox

Stay updated with our newsletter, packed with Tutorials, Interview Questions, How-to's, Tips & Tricks, Latest Trends & Updates, and more ➤ Straight to your inbox!

Course Schedule
NameDates
Core Java TrainingDec 10 to Dec 25
Core Java TrainingDec 13 to Dec 28
Core Java TrainingDec 17 to Jan 01
Core Java TrainingDec 20 to Jan 04
Last updated: 08 December 2022
About Author
SaiKumar Kalla

Kalla Saikumar is a technology expert and is currently working as a content associate at MindMajix. Write articles on multiple platforms such as ServiceNow, Business Analysis, Performance Testing, Mulesoft, Oracle Exadata, Azure, and other courses. And you can join him on LinkedIn.

Recommended Courses

1 /15