Синхронизиран обект: Заключващ код срещу Заключващ обект

Да предположим, че имате две нишки, които имат достъп до един и същ публичен обект. Една нишка има блок от код, който чете полетата на обекта.

synchronized(object)
{
    read object fields
}

Докато кодът на полето за четене на обект се изпълнява в нишка 1, ако нишка 2 иска да актуализира полетата на обекта, ще трябва ли да изчака, докато нишка 1 приключи с четенето на полетата на обекта, преди да актуализира (напр. дали обектът е заключен за достъп от други нишки, докато се изпълнява синхронизиран кодов блок)?


person G Vaid    schedule 01.01.2016    source източник


Отговори (3)


Не, втората нишка няма да чака, освен ако има блок synchronized на същия обект.

synchronized(object)
{
    // read object fields
}

... in other thread:

synchronized(object)
{
    // write object fields
}
person Tamas Hegedus    schedule 01.01.2016

Синхронизирането на обект не го "заключва" по никакъв начин. Освен ако актуализирането на полетата на обекта не е синхронизирано по същия начин, то може много добре да се преплита с кода за четене, който представихте тук.

person Mureinik    schedule 01.01.2016

Синхронизираният блок защитава само кода вътре в него. Така че, ако две или повече нишки се опитат да изпълнят код вътре в синхронизиран блок (защитен от същия обектен монитор), те ще бъдат изпълнени изключително. Това означава, че ако една нишка е влязла в синхронизиран блок, други ще трябва да изчакат, докато тя излезе.

Синхронизираният блок така или иначе не заключва обекта, той просто използва монитора на обекта, за да пази кода вътре в него. Ако искате да направите метода на обектната нишка безопасен, тогава трябва да ги декларирате синхронизирани.

synchronized getField()
synchronized setField()

Сега getField() и setField() могат безопасно да бъдат извикани от множество нишки.

Използването на synchronized обаче има разходи за производителност, вместо това можете да опитате да използвате Locks или Atomic класове в java.util.concurrent.atomic като AtomicInteger, AtomicBoolean или AtomicReference.

person 11thdimension    schedule 01.01.2016
comment
Неправилно. Синхронизираният блок не позволява на друга нишка да изпълнява код, който е синхронизиран на същия обект. - person user207421; 02.01.2016
comment
Моля, вижте част protected by same object monitor - person 11thdimension; 02.01.2016