WildVlad wrote:P.S. Знаете ли Вы что, менее 25% программистов могут полноценно понять параллельную работу и взаимодействие более 3х потоков исполнения?
Надеюсь это из всего числа, а не из тех, кто регулярно занимается multi-threading programming?
Тезисно из того, что запомнилось:
- order of execution is relative to "observer" (waiting thread, or thread observing execution by other thread)
- reordering takes place and it is caused by processor, compiler or cache. Здесь он выделил Интел и Спарк как самые надежные и эффективные для синхронизации, а с дешевыми все гораздо медленнее, менее рационально и platform-related багов много вылазит.
- properly done synchronization is the key to success:
*both read and write must be synchronized
*two synchronized blocks cannot be re-ordered
*do not start thread from constructor, etc.
- synchronization is not only about locks/unlocks. First of all it is about synchronizing "view of memory" between threads
- Must use synchronization to enforce visibility and ordering as well as mutual exclusion
- If you use synchronization correctly, you will not be able to see reorderings
- Problems caused by unproper synchronization can be identified by tools for finding common bug patterns (здесь он упомянул название Inspection gadget...[something])
В JDK 1.5 имплементирована JSR 166, смотри пакет java.util.consurrent (classes AtomicInteger, AtomicLock, etc.)
Кстати в 1.5 еще и много monitoring tools добавлено. Вчера про это китайка говорила из Сана:
JVM & Logging:
1) Runtime Subsystems
2) Class Loading
3) Compilation
4) OS
5) Logging
6) Thread subsystems (thread blocked, which monitor, who is the owner of the monitor, how many times blocked, thread CPU time. etc.)
В 1.5 мониторинг работает только для локальной системы, но теоретически говорили и про RMI. Решается мониторинг посредством MXBean - специальные management beans.
Например memory pool management с новыми бибилиоетками осуществляется очень просто, типа
Low memory detection:
Code: Select all
pool.setUsageThreshold (my Threshold);
while(true) {
if ....ThresholdExceeded
StopRecevingTasks();
else
ResumeReceivingTasks();
Все, что успела записать.
Говорят все быстро, копий никто не раздает, да и знаний у меня маловато все сразу охватить
. Но надеюсь кого заинтересует, а дальше все в Интернете можно найти.
Сабина