java: synchronized accessors (get- методы) - за и против

и задачки для интервью.
dice_m
Новичок
Posts: 56
Joined: 12 Apr 2001 09:01
Location: Russia

java: synchronized accessors (get- методы) - за и против

Post by dice_m »

hallo, all !

хотелось бы услышать мнения насчет - стоит ли делать get- методы класса синхронизированными ?
User avatar
adb
Уже с Приветом
Posts: 9275
Joined: 14 Dec 2001 10:01
Location: Российская Федерация

java: synchronized accessors (get- методы) - за и против

Post by adb »

кАнечно.
Представь что ты пытаешься взять поле, которое другой трэд пытается изменить.
AK70
Уже с Приветом
Posts: 3127
Joined: 10 Apr 2001 09:01
Location: MD

java: synchronized accessors (get- методы) - за и против

Post by AK70 »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by adb:
<strong>кАнечно.
Представь что ты пытаешься взять поле, которое другой трэд пытается изменить.</strong><hr></blockquote>

doesn't make a sense.
Andy77
Уже с Приветом
Posts: 577
Joined: 19 Oct 2000 09:01
Location: Kiev, Ukraine -> Boston, MA -> Minneapolis, MN -> Exton, PA

java: synchronized accessors (get- методы) - за и против

Post by Andy77 »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by AK70:
<strong>

doesn't make a sense.</strong><hr></blockquote>

что именно?
AK70
Уже с Приветом
Posts: 3127
Joined: 10 Apr 2001 09:01
Location: MD

java: synchronized accessors (get- методы) - за и против

Post by AK70 »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by Andy77:
<strong>

что именно?</strong><hr></blockquote>

it's slows an access to data.
User avatar
IPoloz
Уже с Приветом
Posts: 427
Joined: 08 May 2001 09:01

java: synchronized accessors (get- методы) - за и против

Post by IPoloz »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by Dice:
<strong>hallo, all !

хотелось бы услышать мнения насчет - стоит ли делать get- методы класса синхронизированными ?</strong><hr></blockquote>

В идеале - read/write lock только на часть кода реально обрашаюшуюся к разделяемым данным. В жабе его нет, но сделать самому можно за 10 минут. В реальной жизни если есть подозрения на racing condition, делайте синхронизацию, от RC избавитесь, deadlockи получите, а заодно издержки на синхронизацию. Кстати, издержки, даже не deadlock, IMHO, - основная причина почему не стоит все подряд getы синхронизировать. Особенно верно, если get методы нетривиальны, т.е. не просто достают значение переменной, а выполняют более сложную работу, и вызываются часто. В таком случае Вы можете запросто заставить многопоточное приложение сериализоваться, а это Вам надо? Короче, универсального ответа не существует, хотя можно сформулировать guidelines для конкретных случаев.
User avatar
IPoloz
Уже с Приветом
Posts: 427
Joined: 08 May 2001 09:01

java: synchronized accessors (get- методы) - за и против

Post by IPoloz »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by AK70:
<strong>

it's slows an access to data.</strong><hr></blockquote>

...but prevents racing conditions.
AK70
Уже с Приветом
Posts: 3127
Joined: 10 Apr 2001 09:01
Location: MD

java: synchronized accessors (get- методы) - за и против

Post by AK70 »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by green_snake:
<strong>

Особенно верно, если get методы нетривиальны, т.е. не просто достают значение переменной, а выполняют более сложную работу, и вызываются часто.</strong><hr></blockquote>

once, I wrote a small utility class for connection pooling with Oracle JDBC Connection Pools. I had exceptions in a multithreaded application. The matter was that Oracle's getter couldn't handle simultaneous requests. I didn't have time to deal with it. I made synchronized my accessors, and everything went well [img:7795381cfd]images/smiles/icon_smile.gif[/img:7795381cfd]

so, u r right. there's no universal true answer. but it's definitely a bad idea to make getters synchronized "by default".
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

java: synchronized accessors (get- методы) - за и против

Post by tengiz »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by AK70:
it's slows an access to data.<hr></blockquote>Yea, right. Why don't we get rid of all the synchronization? Who needs it anyway? It's just another annoying stupid thing which only introduces additional overhead. [img:94cb97a060]images/smiles/icon_razz.gif[/img:94cb97a060]

А если серьёзно, то полагаю, что AK70 имел в виду, что не стоит бездумно делать все get методы синхронизированными. В конце концов, Вы можете читать данные из уже синхронизированного метода или блока кода, тогда и будет никому не нужный дополнительный overhead. Так что универсального правильного ответа здесь нет.

Обеспечьте качественную документацию и оговорите специально, что такие-то и такие-то методы класса являются thread-neutral и что клиент сам должен позаботиться о синхронизации.

P.S. Пока я писал, AK70 сам всё и разъяснил...

[ 03-01-2002: Message edited by: tengiz ]</p>
dice_m
Новичок
Posts: 56
Joined: 12 Apr 2001 09:01
Location: Russia

java: synchronized accessors (get- методы) - за и против

Post by dice_m »

высказанные здесь мнения, навеяли мне на такую мысль ... состояние бина = совокупность (!!!) значений полей, ПОЭТОМУ делать get- и даже set- синхронизированными - в принципе не верно - это overhead и больше ничего !!

ПОТОМУ, ЧТО читать наполовину записанный (другим потоком) бин мягко говоря неправильно, а такая ситуевина возникнет даже если все (!) get/set будут синхронизированы.

ПРАВИЛЬНОЕ РЕШЕНИЕ (имхо) - читать состояние бина (в локальные переменные потока) внутри синх блока ;-)) соответственно писать - точно так же.

делать синхронизированными, стоит только методы, меняющие состояние бина 'за раз' всякие там load(), setState() ... does anyone have more comments ??

[img:325f06e9fd]images/smiles/icon_biggrin.gif[/img:325f06e9fd]
User avatar
IPoloz
Уже с Приветом
Posts: 427
Joined: 08 May 2001 09:01

java: synchronized accessors (get- методы) - за и против

Post by IPoloz »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by Dice:
<strong>высказанные здесь мнения, навеяли мне на такую мысль ... состояние бина = совокупность (!!!) значений полей, ПОЭТОМУ делать get- и даже set- синхронизированными - в принципе не верно - это overhead и больше ничего !!

ПОТОМУ, ЧТО читать наполовину записанный (другим потоком) бин мягко говоря неправильно, а такая ситуевина возникнет даже если все (!) get/set будут синхронизированы.

ПРАВИЛЬНОЕ РЕШЕНИЕ (имхо) - читать состояние бина (в локальные переменные потока) внутри синх блока ;-)) соответственно писать - точно так же.

делать синхронизированными, стоит только методы, меняющие состояние бина 'за раз' всякие там load(), setState() ... does anyone have more comments ??

[img:060f06ee09]images/smiles/icon_biggrin.gif[/img:060f06ee09] </strong><hr></blockquote>

Например так?
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">code:</font><hr><pre>
class MyBeanState1 {
...
}

...
class MyBean {
private MyBeanState m_state;
public synchronized MyBeanState getState() {
return m_state.clone();
}
public synchronized void setState(MyBeanState newState) {
m_state=newState.clone();
commit(m_state);
}
private void commit(MyBeanState state) {
//Do any database or other real work here
}
}
</pre><hr></blockquote>
Кстати, не надо помещать ВСЕ данные в MyBeanState, более умно сделать несколько разных классов и для каждого определить свой setState метод, таким образом, чтобы каждый state переводил бин из одного легального состояния в другое.
AK70
Уже с Приветом
Posts: 3127
Joined: 10 Apr 2001 09:01
Location: MD

java: synchronized accessors (get- методы) - за и против

Post by AK70 »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by Dice:
<strong>это overhead и больше ничего !!
</strong><hr></blockquote>

wrong
dice_m
Новичок
Posts: 56
Joined: 12 Apr 2001 09:01
Location: Russia

java: synchronized accessors (get- методы) - за и против

Post by dice_m »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>
Например так?
...
<hr></blockquote>
именно так, если поля стейта - immutable [img:aa1cb41932]images/smiles/icon_smile.gif[/img:aa1cb41932]

[img:aa1cb41932]images/smiles/icon_biggrin.gif[/img:aa1cb41932]
dice_m
Новичок
Posts: 56
Joined: 12 Apr 2001 09:01
Location: Russia

java: synchronized accessors (get- методы) - за и против

Post by dice_m »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by AK70:
<strong>

wrong</strong><hr></blockquote>
why ? do u have any counterexamples ?
[img:5cd62e0548]images/smiles/icon_biggrin.gif[/img:5cd62e0548]
User avatar
IPoloz
Уже с Приветом
Posts: 427
Joined: 08 May 2001 09:01

java: synchronized accessors (get- методы) - за и против

Post by IPoloz »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by Dice:
<strong>
именно так, если поля стейта - immutable [img:16cf41d562]images/smiles/icon_smile.gif[/img:16cf41d562]

[img:16cf41d562]images/smiles/icon_biggrin.gif[/img:16cf41d562] </strong><hr></blockquote>

Не понял, а откуда взялось это требование? Если clone определить правильно, то проблем не будет - меняйте себе на здоровье [img:16cf41d562]images/smiles/icon_smile.gif[/img:16cf41d562]
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr> why ? do u have any counterexamples ?
<hr></blockquote>
Да потому что Вы в крайности бросаетесь - то синхронизировать ВСЕ методы, то - один. Нельзя так [img:16cf41d562]images/smiles/icon_smile.gif[/img:16cf41d562]
AK70
Уже с Приветом
Posts: 3127
Joined: 10 Apr 2001 09:01
Location: MD

java: synchronized accessors (get- методы) - за и против

Post by AK70 »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by green_snake:
<strong>
Да потому что Вы в крайности бросаетесь - то синхронизировать ВСЕ методы, то - один. Нельзя так [img:0a78878150]images/smiles/icon_smile.gif[/img:0a78878150] </strong><hr></blockquote>

exactly [img:0a78878150]images/smiles/icon_smile.gif[/img:0a78878150]
Max
Уже с Приветом
Posts: 359
Joined: 20 Jan 1999 10:01
Location: Seattle, Washington, USA

java: synchronized accessors (get- методы) - за и против

Post by Max »

Есть хорошая книжка. Рекомендую почитать всем кто на Жабе с потоками сталкивается.

Return to “Головоломки”