Every computer program works with data. They get the data from a database, a file, or another source, transform that data, and then write the transformed data into a database, a file, or another destination. Programs work with data stored in memory and use data structures to store the data in memory.
When you implement a concurrent application, you must be very careful with the utilization of data structures. If different threads can modify the data stored in a unique data structure, you have to use a synchronization mechanism to protect the modifications over that data structure. If you don't do this, you may have a data race condition. Your application may sometimes work correctly, but next time may crash with a random exception, stuck in an infinite loop or silently produce an incorrect result. The outcome will depend on the order of execution...