Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно пользоваться синхронизацией, требуется synchronized()  
V
    Опции темы
barin_Student
Дата 27.11.2007, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: 1
Всего: 2



У меня есть довольно большой(неудобно на форуме смотреть) класс для примера , вот там синхронизация нужна , а как правильно ее выполнить не могу найти Faq , вот и у вас хотел бы спросить.(могу привести тот класс). Просто когда тупо везде втыкаю синхронизацию , поток останавливается без ошибок , просто висит и все. smile 


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
barin_Student
Дата 27.11.2007, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: 1
Всего: 2



вот кусок класса внутри которого устраиваивается синхронизация , вот если убрать закаментирование то получается так что просто класс повисает.
Классы требуещие синхронизации есть демоны.
Код

 case Data.SUBMIT_SM :
                            try
                            {
                                                            SubmitSM submit = new SubmitSM();
                                                            submit.setData(request.getData());
                                                                                            
                                                            String telefon=submit.getDestAddr().getAddress();
                                                            System.out.println("Phone # "+telefon.substring(1, 4));
                                                            history.Write("Submit for number ["+telefon+"]");
                                                            boolean isOurNumber=false;
                                                            SubmitSMResp submitResponse = (SubmitSMResp) response;
                                                            submitResponse.setMessageId(assignMessageId());
               
                                                            if((telefon.substring(1, 4).equals(BeelineNumber1))||
                                                                 (telefon.substring(1, 4).equals(BeelineNumber2))||
                                                                 (telefon.substring(1, 4).equals(KCellNumber1))||
                                                                 (telefon.substring(1, 4).equals(KCellNumber2)))
                                                            {
                                                                isOurNumber=true;
                                                                System.out.println("Ura , ELKI PALKI");
                                                            }
                                                            System.out.println("BeelineNumber1: "+BeelineNumber1);
                                                            System.out.println("BeelineNumber2: "+BeelineNumber2);
                                                            System.out.println("KCellNumber1: "+KCellNumber1);
                                                            System.out.println("KCellNumber2: "+KCellNumber2);
                                                            if((telefon.substring(1, 4).equals(BeelineNumber1))||
                                                                 (telefon.substring(1, 4).equals(BeelineNumber2)))
                                                            {
                                                                history.Write("Submit for Beeline "+submit.debugString());
                                                                submit.setDestAddr(Beeline_ton,Beeline_npi,telefon);
                                                                //synchronized(this.SyncBeeline)
                                                                {
                                                                    history.Write("Submit for Beeline "+submit.debugString());
                                                                    this.SyncBeeline.flagIncommingPDU=true;
                                                                    this.SyncBeeline.setPDU(submit);
                                                                }
                                                            }                                                                   
                                      
                                                            if (telefon.substring(1, 4).equals(KCellNumber1)||(telefon.substring(1,4).equals(KCellNumber2)))
                                                            {
                                                                 submit.setDestAddr(KCell_ton,KCell_npi,telefon);
                                                                // synchronized(this.SyncKCell)
                                                                 {
                                                                    this.SyncKCell.flagIncommingPDU=true;
                                                                    this.SyncKCell.setPDU(submit);
                                                                 }
                                                             }
                                                           
                                                             if(isOurNumber == false)
                                                             {
                                                                response.setCommandStatus(0x00000045);
                                                                history.Write("Error Submit no number in our config file "+telefon);
                                                                history.Write("Send response to OpenWay with Error "+submitResponse.debugString());
                                                             }
                                  display("putting message into message store");        
                                 messageStore.submit((SubmitSM) request, submitResponse.getMessageId(), systemId);
                                byte registeredDelivery =(byte) (((SubmitSM) request).getRegisteredDelivery() & Data.SM_SMSC_RECEIPT_MASK);
                                if (registeredDelivery == Data.SM_SMSC_RECEIPT_REQUESTED) {
                                    deliveryInfoSender.submit(this, (SubmitSM) request, submitResponse.getMessageId());
                                }
                            }catch (Exception e)
                            {
                                System.out.println("ERROR "+e);
                                                                errorWriter.WriteError("error in SubmitSM "+e);
                            }
                            break;



--------------------
Нехорошо блин!!!
PM MAIL   Вверх
ivg
Дата 27.11.2007, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Цитата(barin_Student)
Нехорошо блин!!!

Точно.
this.SyncBeeline - класс этого объекта наледует Thread? Если так, то предположу, что вы пытаетесь реализовать асинхронную посылку SMS?
Вобщем, по тому коду, что вы привели, ничего сказать нельзя, только предположения. Покажите код класса объекта this.SyncBeeline, особенно где есть 
synchronized(this) или this.wait()
Если это потоки, покажите основной метод, в котором они работают (обычно run()).

PS: В одиночку трудитесь? Ваш код надо улучшать... 
PM MAIL   Вверх
barin_Student
Дата 28.11.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: 1
Всего: 2



Делаю один и заканчиваю , для поключения к SMSC использую синхронную часть , а мой SMSC работает асинхронно(так надо), синхронизация требовалась , для того чтоб не преравать к примеру получения ответа на запрос , потем отправления другого запроса(дожадаться окончания действия), решил все без синхронизации , чуть флаги изменил и все.
Насчет кода , да знаю есть куча клякс и требует оптимизации. Со временем прийду к полному пониманию язака ява. А то я его уже месяца 4 изучаю , а чтоб  написать  и точно знать как что сейчас пойдет , вот к этому я еще не пришел.  smile 


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
Dims
Дата 28.11.2007, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 4
Всего: 11



synchronized ждёт, пока объект-аргумент освободится, потом захватывает его и проходит дальше. пока объект захвачен, другие потоки ждут у входа своих synchronized.

То есть, synchronized должен огораживать использование того объекта, который нельзя использовать параллельно. Это не обязательно тот объект, который захватывается и освобождается. Он может служить лишь "светофором" и ограничивать "езду" по другому объекту -- "перекрёстку".

Если synchronized стоит перед методом, то захватывается весь объект, к которому принадлежит этот метод.

Если у Вас всё зависает, значит образовалась "пробка". Например, несколько потоков ждут освобождения каких-то объектов, которые не могут быть освобождены, так как отвечающие за это потоки тоже ждут.

Старайтесь использовать как можно меньше объектов синхронизации.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0444 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.