У всех объектов в java есть что-то, называемое внутренней блокировкой. Если какой-либо поток хочет выполнить какую-либо операцию над любым объектом, ему необходимо получить внутреннюю блокировку этого объекта. это гарантирует, что только один поток будет обрабатывать ваш блок кода в любой момент времени.
Поток может получить блокировку для любого объекта, если этот объект не заблокирован каким-либо другим потоком, если он заблокирован, поток будет ждать, пока другой поток не снимет блокировку с этого объекта.
если вы используете синхронизированный блок, ваш код будет выглядеть примерно так
public void SomeObject exampleGetter() {
synchronized(this)
{
if(this.isReceiving)
return oldCachedObject;
else
return currentObject;
}
В этом случае, когда ваш поток входит в синхронизированный блок, если какой-либо другой поток блокирует этот объект, он будет ждать, пока этот поток не снимет блокировку. и если этот объект свободен, то ваш поток получит блокировку для этого объекта и выполнит операцию, а затем снимет блокировку для этого объекта.
для получения дополнительной информации о синхронизированных блоках, методах и внутренних блокировках, обратитесь к
http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
Надеюсь, это вам помогло:)