Читайте также:
|
|
1 Когда двум или более потоком требуется доступ к совместно используемым ресурсам, то нужен способ доступа к ресурсам не более 1 потока в каждый момент времени. В Java это достигается при помощи процесса синхронизации. Решается данная проблема при помощи концепции монитора, который представляется объектом, используемым как взаимоисключающая блокировка, лишь один поток может владеть монитором в данное время. все другие потоки, которые требуют доступ в монитор будут приостановлены до его освобождения. Поток, который владеет монитором может повторно войти в монитор, если это необходимо. Для примера синхронизации потока разберем следующую программу. необходимо вывести на экран с помощью потоков следующую надпись (три слова, располож в кв. скобках).
[fgdshg]
[sgdhs]
[gdg]
Будут использоваться 3 класса.
1 класс - содержит метод, вызывающий первую строку.
class CallMe {
void call (string msg){
Systemout… (“[“+msg
try {
второй класс создает новый поток, который вызывает метод Run объекта
class Caller …
Runnable {
string msg
Callme target
третий класс будет создавать экземпляр класса CallMe и три экземпляра класса Coller каждый с уникальной строкой сообщения. Класс Coller будет получать один и тот же экземпляр класса CallMe.
class
public
….
После запуска данной программы результат работы мы видим в следующем варианте:
[Me[…[Java]
]
]
Данная ситуация происходит к непоследовательному доступу потокам к методу Call. Необходимо органичения доступа к методу лишь одним потоком. Для этого используется модификатор synchronized
Т.е. метод Call должен описываться следующим образом:
synchronized void Call (далее как в примере)
Это один из способов решения вопроса синхронизации.
Однако бывает необходимость в синхронизации метода класса, который не был разработан для многопоточного программирования, соответственно не имеет в своей структуры параллельно выполняющихся методов. synchronized (объект) {операторы класса, работу которых необходимо синхронизировать, при этом объект - ссылка на синхронизируемый объект}. Исходя из этой формы записи пример можно переписать следующим образом:
При этом следует помнить следующее: при многопоточном программировании в Java создавать потоки и их использовать следует с осторожностью, т.к. выполняющая система Java может снизить производительность из-за большого числа наличия потоков. связанно это с тем, что большая часть времени работы многопоточных приложений уйдет на изменение контекста приложение, а не на выполнение отдельных потоков и программ.
Дата добавления: 2014-12-15; просмотров: 34 | Поможем написать вашу работу | Нарушение авторских прав |