Coherence: Let's say you have a multi-threaded application where you have multiple threads executing on multiple processors. They share same main memory but their processor registered memory which is L1,L2 memory cache, they are unique to processor, so they are not shared. If you want a particular variable to have a coherent value between all threads, then you declare that variable volatile(not all programming languages have this). Volatile means, copy of that variable should remain consistent in all processors.
If that variable is modified in one thread, that will force a refresh of that variable in other processors, and memory space as well. Their cache will be also refreshed. Because we changed a variable in one processor that will lead to change in the value of that variable and another processor cache as well. This comes at a performance cost.
If we have a lot of variables that are shared and we modify them a lot, this means that in such an application, the coherent cost will be high. So if increasing the number of threads or number of processors in order to increase the throughput
, then throughput
does not increase but instead, it starts decreasing.

Contention is related to Amdahl's Law
: Understanding Amdahl's law
Amdahl's law does not bring down throughput, it flattens but when you have incoherency then throughput will have negative return.