Синхронизация потоков

Многопоточный режим работы открывает новые возможности для программистов, однако эти возможности приводят к усложнению процесса проектирования приложения и отладки. Основное различие между потоками и процессами состоит в том, что процессы защищены от воздействия друг на друга средствами ОС, но использование потоков, лишенных такой защиты позволяет быстро их запускать и способствует повышению их производительности. Однако существует отрицательный эффект. Любой из потоков может получить доступ и внести изменения в данные, который другой поток считает принадлежащим только ему. Решение такой проблемы состоит в синхронизации потоков. Однопоточная программа, такая, например, как программа MS-DOS, при запуске получает в монопольное распоряжение все ресурсы компьютера. Т.к. в однопоточной системе существует только один процесс, он использует эти ресурсы в той последовательности, которая соответствует логике работы программы. Процессы и потоки, работающие одновременно в многопоточной системе, могут пытаться обращаться одновременно к одним и тем же ресурсам, что может привести к неправильной работе приложений. В языке программирования Java предусмотрено несколько средств для синхронизации потоков. Синхронизация методов . Возможность синхронизации как бы встроена в каждый объект, создаваемый приложением Java. Для этого объекты снабжаются защелками, которые могут быть использованы для блокировки потоков, обращающихся к этим объектам. Чтобы воспользоваться защелками, вы можете объявить соответствующий метод как synchronized, сделав его синхронизированным и гарантирующим доступ к элементу в каждый момент времени только одному потоку.

public synchronized void decrement() {…}

При вызове синхронизированного метода соответствующий ему объект (в котором он определен) блокируется для использования другими синхронизированными методами. Когда один из потоков войдя в критический участок осуществляет захват поля и если другой поток попытается войти, то он будет заблокирован оператором синхронайз, до тех пор, пока первый поток не завершит выполнение данного блока. В результате предотвращается одновременная запись двумя методами значений в область памяти, принадлежащую данному объекту.

Блокировка потока . Синхронизированный поток, определенный как метод типа synchronized, может переходить в заблокированное состояние автоматически при попытке обращения к ресурсу, занятому другим синхронизированным методом, либо при выполнении некоторых операций ввода или вывода. Однако в ряде случаев полезно иметь средства синхронизации, допускающие явное использование по запросу приложения. Блокировка на заданный период времени - С помощью метода sleep можно заблокировать поток на заданный период времени:

try{ Thread.sleep(500);}catch (InterruptedException ee){ . . .}