That is different parts of the same program can be executing at the same time, or behave if they are executing at the same time. Java uses threads to achieve concurrency. Writing concurrent programs presents a number of issues that do not occur in writing sequential code. Two different threads could write to the same memory location at the same time, leaving the memory location in an improper state. Liveness Threads can become deadlocked, each thread waiting forever for the other to perform a task.
Threads can become livelocked, waiting forever to get their turn to execute.
Nondeterminism Thread activities can become intertwined. Different executions of a program with the same input can produce different results. This can make program hard to debug. Communication Different threads in the same program execute autonomously from each other. Communication between threads is an issue.