java: synchronized accessors (get- методы) - за и против
-
- Новичок
- Posts: 56
- Joined: 12 Apr 2001 09:01
- Location: Russia
java: synchronized accessors (get- методы) - за и против
hallo, all !
хотелось бы услышать мнения насчет - стоит ли делать get- методы класса синхронизированными ?
хотелось бы услышать мнения насчет - стоит ли делать get- методы класса синхронизированными ?
-
- Уже с Приветом
- Posts: 9275
- Joined: 14 Dec 2001 10:01
- Location: Российская Федерация
java: synchronized accessors (get- методы) - за и против
кАнечно.
Представь что ты пытаешься взять поле, которое другой трэд пытается изменить.
Представь что ты пытаешься взять поле, которое другой трэд пытается изменить.
-
- Уже с Приветом
- Posts: 3127
- Joined: 10 Apr 2001 09:01
- Location: MD
java: synchronized accessors (get- методы) - за и против
<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.
<strong>кАнечно.
Представь что ты пытаешься взять поле, которое другой трэд пытается изменить.</strong><hr></blockquote>
doesn't make a sense.
-
- Уже с Приветом
- Posts: 577
- Joined: 19 Oct 2000 09:01
- Location: Kiev, Ukraine -> Boston, MA -> Minneapolis, MN -> Exton, PA
java: synchronized accessors (get- методы) - за и против
<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>
что именно?
<strong>
doesn't make a sense.</strong><hr></blockquote>
что именно?
-
- Уже с Приветом
- Posts: 3127
- Joined: 10 Apr 2001 09:01
- Location: MD
java: synchronized accessors (get- методы) - за и против
<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.
<strong>
что именно?</strong><hr></blockquote>
it's slows an access to data.
-
- Уже с Приветом
- Posts: 427
- Joined: 08 May 2001 09:01
java: synchronized accessors (get- методы) - за и против
<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 для конкретных случаев.
<strong>hallo, all !
хотелось бы услышать мнения насчет - стоит ли делать get- методы класса синхронизированными ?</strong><hr></blockquote>
В идеале - read/write lock только на часть кода реально обрашаюшуюся к разделяемым данным. В жабе его нет, но сделать самому можно за 10 минут. В реальной жизни если есть подозрения на racing condition, делайте синхронизацию, от RC избавитесь, deadlockи получите, а заодно издержки на синхронизацию. Кстати, издержки, даже не deadlock, IMHO, - основная причина почему не стоит все подряд getы синхронизировать. Особенно верно, если get методы нетривиальны, т.е. не просто достают значение переменной, а выполняют более сложную работу, и вызываются часто. В таком случае Вы можете запросто заставить многопоточное приложение сериализоваться, а это Вам надо? Короче, универсального ответа не существует, хотя можно сформулировать guidelines для конкретных случаев.
-
- Уже с Приветом
- Posts: 427
- Joined: 08 May 2001 09:01
java: synchronized accessors (get- методы) - за и против
<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.
<strong>
it's slows an access to data.</strong><hr></blockquote>
...but prevents racing conditions.
-
- Уже с Приветом
- Posts: 3127
- Joined: 10 Apr 2001 09:01
- Location: MD
java: synchronized accessors (get- методы) - за и против
<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".
<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".
-
- Уже с Приветом
- Posts: 4468
- Joined: 21 Sep 2000 09:01
- Location: Sammamish, WA
java: synchronized accessors (get- методы) - за и против
<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>
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>
-
- Новичок
- Posts: 56
- Joined: 12 Apr 2001 09:01
- Location: Russia
java: synchronized accessors (get- методы) - за и против
высказанные здесь мнения, навеяли мне на такую мысль ... состояние бина = совокупность (!!!) значений полей, ПОЭТОМУ делать get- и даже set- синхронизированными - в принципе не верно - это overhead и больше ничего !!
ПОТОМУ, ЧТО читать наполовину записанный (другим потоком) бин мягко говоря неправильно, а такая ситуевина возникнет даже если все (!) get/set будут синхронизированы.
ПРАВИЛЬНОЕ РЕШЕНИЕ (имхо) - читать состояние бина (в локальные переменные потока) внутри синх блока ;-)) соответственно писать - точно так же.
делать синхронизированными, стоит только методы, меняющие состояние бина 'за раз' всякие там load(), setState() ... does anyone have more comments ??
[img:325f06e9fd]images/smiles/icon_biggrin.gif[/img:325f06e9fd]
ПОТОМУ, ЧТО читать наполовину записанный (другим потоком) бин мягко говоря неправильно, а такая ситуевина возникнет даже если все (!) get/set будут синхронизированы.
ПРАВИЛЬНОЕ РЕШЕНИЕ (имхо) - читать состояние бина (в локальные переменные потока) внутри синх блока ;-)) соответственно писать - точно так же.
делать синхронизированными, стоит только методы, меняющие состояние бина 'за раз' всякие там load(), setState() ... does anyone have more comments ??
[img:325f06e9fd]images/smiles/icon_biggrin.gif[/img:325f06e9fd]
-
- Уже с Приветом
- Posts: 427
- Joined: 08 May 2001 09:01
java: synchronized accessors (get- методы) - за и против
<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 переводил бин из одного легального состояния в другое.
<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 переводил бин из одного легального состояния в другое.
-
- Уже с Приветом
- Posts: 3127
- Joined: 10 Apr 2001 09:01
- Location: MD
java: synchronized accessors (get- методы) - за и против
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by Dice:
<strong>это overhead и больше ничего !!
</strong><hr></blockquote>
wrong
<strong>это overhead и больше ничего !!
</strong><hr></blockquote>
wrong
-
- Новичок
- Posts: 56
- Joined: 12 Apr 2001 09:01
- Location: Russia
java: synchronized accessors (get- методы) - за и против
<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]
Например так?
...
<hr></blockquote>
именно так, если поля стейта - immutable [img:aa1cb41932]images/smiles/icon_smile.gif[/img:aa1cb41932]
[img:aa1cb41932]images/smiles/icon_biggrin.gif[/img:aa1cb41932]
-
- Новичок
- Posts: 56
- Joined: 12 Apr 2001 09:01
- Location: Russia
java: synchronized accessors (get- методы) - за и против
<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]
<strong>
wrong</strong><hr></blockquote>
why ? do u have any counterexamples ?
[img:5cd62e0548]images/smiles/icon_biggrin.gif[/img:5cd62e0548]
-
- Уже с Приветом
- Posts: 427
- Joined: 08 May 2001 09:01
java: synchronized accessors (get- методы) - за и против
<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]
<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]
-
- Уже с Приветом
- Posts: 3127
- Joined: 10 Apr 2001 09:01
- Location: MD
java: synchronized accessors (get- методы) - за и против
<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]
<strong>
Да потому что Вы в крайности бросаетесь - то синхронизировать ВСЕ методы, то - один. Нельзя так [img:0a78878150]images/smiles/icon_smile.gif[/img:0a78878150] </strong><hr></blockquote>
exactly [img:0a78878150]images/smiles/icon_smile.gif[/img:0a78878150]
-
- Уже с Приветом
- Posts: 359
- Joined: 20 Jan 1999 10:01
- Location: Seattle, Washington, USA
java: synchronized accessors (get- методы) - за и против
Есть хорошая книжка. Рекомендую почитать всем кто на Жабе с потоками сталкивается.