|
|
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Добрый день. Из-за недопонимания возникло сомнение в правильности реализации многопоточного приложения. В случае если множество потоков асинхронно вызывают статические методы какого либо класса не приводит ли это к падению производительности. Не происходит ли задержка и ожидание одного потока пока другой поток не вышел из статического метода какого-то совместно используемого ими класса. (Вопросы синхронизации не рассматриваем- у используемого класса она ни к чему) Вызываемые статические методы просты- типа : public boolean getBool(int f) { if(f>9) {return true;}else{return false;} } Не понятно как работает JVM в таком случае- если экземпляр класса содержащего статические методы создается один раз- должна происходить ожидание потоков на таких статических методах....? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 01:16:37 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Nik683, Вы заблуждаетесь. Никакой неявной синхронизации на статических методах нет. Методы из множества потоков вызываются не 'асинхронно' а 'параллельно'. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 08:22:07 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, То есть для каждого потока JVM создает свой "экземпляр" статического класса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 08:55:48 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Nik683, ...точнее класса содержащего статические методы...? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 08:56:38 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Nik683, public static boolean .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 08:57:34 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Nik683, Нет. Экземпляров столько, сколько было загружено класслоадерами. В норме правило примерно такое: один инстанс на одно изолированное приложение или один инстанс на всю JVM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 09:46:43 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Nik683То есть для каждого потока JVM создает свой "экземпляр" статического класса? тоже нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 10:58:07 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Nik683Nik683, public static boolean .... Отличный коментарий. Чтобы он значил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 10:59:02 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, в первоначально вопросе метод объевил по ошибке не статическим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 11:12:13 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Nik683в первоначально вопросе метод объевил по ошибке не статическим Да, не важно. Мы пон е ли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 11:18:24 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
cdtyjv, то есть на каждый поток свой класслоадер и соответственно свой экземпляр класса содержащего статические методы ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 11:18:49 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Nik683cdtyjv, то есть на каждый поток свой класслоадер и соответственно свой экземпляр класса содержащего статические методы ?Нет. Что вам мешает прочитать документацию по этому вопросу, и не задавать множество глупых вопросов? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 11:20:04 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Nik683то есть на каждый поток свой класслоадер и соответственно свой экземпляр класса содержащего статические методы ? Потоки отдельно, классы отдельно. Это две перепендикулярные сущности. Класслоадеры - отдельная тема связаная с классами, но не с потоками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 11:22:03 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
cdtyjv, посоветуете где почитать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 11:25:17 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Nik683посоветуете где почитать?В Google, разумеется :-) Две ключевые фразы: "java static keyword", "java classloading". После этого все должно встать на свои места. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 11:38:38 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
cdtyjv, спасибо и на этом) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 11:45:12 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, именно поэтому у меня и возник вопрос по поводу того как разные потоки используют статические методы. каков внутренний механизм. с одной стороны в литературе сказано что класс содержащий статический метод создается один раз. а с другой стороны если он создается один раз то как он без "конкуренции" используется разными потоками... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 11:49:16 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Nik683как он без "конкуренции" используется разными потоками Примерно так же как этот топик используется разными пользователями. Метод это байт-код который можно читать и исполнять, не конкурируя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 11:54:01 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Nik683с одной стороны в литературе сказано что класс содержащий статический метод создается один раз Нет. В литературе так не сказано. Либо привидите ссылку и цитату. 1) Класс создаётся один раз в контексте одной ветки иерархии класслоадеров. Если это сложно с наскока понять, то в первом приближении, считайте что один класс на один класслоадер. Потому что на самом деле оно так и есть. Класс загруженый 2 раза разными classloader-ами это фактически 2 разных класса с точки зрения JVM. 2) Первое утверждение не зависит от наличия\отсутствия в классе статических методов. Оно истинно и для классов без статических методов. Nik683а с другой стороны если он создается один раз то как он без "конкуренции" используется разными потоками... 3) Загрузка классов это одно. Исполнение классов это другое. Исполненик классов возможно только после загрузки. Загрузка синхронизирована внутренними средствами и происходит только один раз в первом потоке. Остальные потоки ждут загрузки класса если нужно. А вот исполнение методов, как статических так и не статических происходит "конкурентно", если эти методы не синхронизированы. К процессу загрузки это отношения не имеет. Так же как и не имеет отношения к статичности методов. Приведите более внятный код, который бы помог вам прояснить ситуацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 11:58:37 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. Вот такая тестовая ситуация, и у меня получается что все потоки используют один и тож же класс со статическим методом.. А если так то получается что один поток ждет пока другой освободит для него метод TheS.printSomething ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 12:58:46 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Ааа... мои глаза... Срочно читать http://www.oracle.com/technetwork/java/codeconv-138413.html Или хотя бы найдите кнопку в вашей IDE которая код форматирует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 13:03:40 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Nik683А если так то получается что один поток ждет пока другой освободит для него метод TheS.printSomething ? Нет. Они его выполняют параллельно и одновременно уходят в sleep(). Это легко проверить, если sleep сделать немного подольше, запустить в дебаге и нажать паузу. По стэку всех потоков вы увидите что каждый из них находится внутри printSomething, а не снаружи, как было бы при его синхронизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 13:05:19 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, А как это "физически" происходит ? Получается что для паралелmного выполнения для каждого потока должна создаваться некая "копия" класса TheS ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 13:24:10 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Nik683А как это "физически" происходит ? "Физически" подразумевает что у вас уже есть некоторые представления о том как работают RAM и CPU компьютера? Если, нет, то наверное стоит ненадолго отложить Java в сторону и почитать о внутреннем устройстве ПК. Nik683Получается что для паралелmного выполнения для каждого потока должна создаваться некая "копия" класса TheS ? Нет. Методы это команды процессору. Они не являются "критическим ресурсом". Потоки исполняют команды. Ничто не мешает разным потокам исполнять одни и те же команды одновременно. Метод это набор команд. Для исполнения метода, никаких копий метода создавать не нужно. "Критическим ресурсом" является память. Память это поля. Как статические, так и нет. Ничто не мешает читать память потокам одновременно. Это всё понятно? Методы и доступ к полям сами по себе не синхронизируются и могут производится одновременно разными потоками. Для их синхронизации нужно использовать специальные механизмы, чтобы организовать паралельный доступ так как нужно логике программы. В JLS есть раздел о том что синхронизировано не явно. Это, например, загрузка и инициализация класса. Статические инициализаторы не исполняются паралелльно. Только одним потоком для одного класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 13:34:12 |
|
||
|
потоки и статические методы
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, представление есть. насколько я понимаю метод TheS.printSomething есть набор команд в памяти (последовательность 1 и 0 в конечном итоге). И мне не понятно как это набор команд (если "физически" он один на всех) может одновременно выполнятся 100 потоками , даже если у нас например 8 процессоров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 13:43:35 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38499773&tid=2127991]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
190ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 518ms |

| 0 / 0 |
