Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 8

Почему не срабатывает сериализация доступа

30.05.2013, 23:38. Показов 668. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
добрый день!
подскажите, пожалуйста, в чем загвоздка?
есть два варианта кода, в одном синхронизация метода срабатывает, в другом нет, не могу понять почему.

первый вариант (в котором ключевое слово synchronized имеет эффект):
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
class Callme {
  synchronized void call(String msg) {
    System.out.print("[" + msg);
    try {
      Thread.sleep(2000);
    } catch(InterruptedException e) {
      System.out.println("Interrupted");
    }
    System.out.println("]");
  }
}
 
class Caller1 implements Runnable {
  String msg;
  Callme target;
  Thread t;
 
  public Caller1(Callme targ, String s) {
    target = targ;
    msg = s;
    t = new Thread(this);
    t.start();
  }
 
  public void run() {
    target.call(msg);
  }
}
 
class Demo3 {
  public static void main(String args[]) {
    Callme target = new Callme();
    Caller1 ob1 = new Caller1 (target, "Hello");
    Caller1 ob2 = new Caller1 (target, "Synchronized");
   Caller1 ob3 = new Caller1 (target, "World");
 
    // wait for threads to end
    try {
      ob1.t.join();
      ob2.t.join();
      ob3.t.join();
    } catch(InterruptedException e) {
      System.out.println("Interrupted");
    }
  }
}
второй вариант (получен путем соединения двух классов в один из первого варианта) - синхронизация метода не дает нужного эффекта:
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
class Caller implements Runnable {
  String msg;
  Thread t;
 
  public Caller(String s) {
    msg = s;
    t = new Thread(this);
    t.start();
  }
 
  public void run() {
    call(msg);
  }
    
  synchronized void call(String msg) {
    System.out.print("[" + msg);
    try {
      Thread.sleep(2000);
    } catch(InterruptedException e) {
      System.out.println("Interrupted");
    }
    System.out.println("]");
  }
}
 
class Demo {
  public static void main(String args[]) {
    Caller ob1 = new Caller("Hello");
    Caller ob2 = new Caller("Synchronized");
    Caller ob3 = new Caller("World");
 
    try {
      ob1.t.join();
      ob2.t.join();
      ob3.t.join();
    } catch(InterruptedException e) {
      System.out.println("Interrupted");
    }
  }
}
результат вывода первого кода:
Java
1
2
3
4
run:
[Hello]
[World]
[Synchronized]
методы выполняются синхронизированно, но непонятно почему слово World отображается первее слова Synchronized?

результат вывода второго примера кода:
Java
1
2
3
4
run:
[Hello[World[Synchronized]
]
]
заранее спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.05.2013, 23:38
Ответы с готовыми решениями:

почему обявление уровня доступа является нежелательным способом предявления доступа, в отличии от использования пространстрва имён?
почему обявление уровня доступа является нежелательным способом предявления доступа, в отличии от использования пространстрва имён?

сериализация- объясните, почему так?
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Почему срабатывает for?
#include <stdio.h> #include <conio.h> long int fact ( int N ) { int f, i; for ( i=1, f=1 ; i <= N ; i++ ) f*=i; return...

3
91 / 91 / 10
Регистрация: 18.05.2013
Сообщений: 265
31.05.2013, 08:46
Вы на самом деле сделали совсем различные механизмы, которые совершенно не коррелируют ... посмотрите алгоритмы вызовов, у Вас одно с другим совсем не стыкуется ...
1
8 / 8 / 1
Регистрация: 19.04.2012
Сообщений: 26
31.05.2013, 09:48
Почему не срабатывает сериализация доступа
Наверное, синхронизация?
Итак, в первом варианте Вы тремя потоками пытаетесь захватыватить монитор одного и того же объекта target. Первый поток захватил, остальные ждут, пока первый закончит выполнение синхронизированного метода, выйдет из него и отпустит монитор. После этого JVM рандомно выбирает другой поток, который захватывает монитор, остальные ждут. И т.д. В этом и заключалась синхронизация потоков. Во втором варианте вы создаете три разных объекта, получаете три ссылки на них и захватываете разные мониторы каждым потоком. Это как в футболе выкинуть на поле 22 мяча - бороться нЕ за что.
1
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 8
31.05.2013, 11:01  [ТС]
большое спасибо, теперь понятно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.05.2013, 11:01
Помогаю со студенческими работами здесь

Почему не срабатывает?
Почему следующий код работает: <?php if (($_SERVER !== '/') || ($_SERVER !== '/index.php')): ?> <style type="text/css"> ...

Почему не срабатывает messagebox в try?
Добрый день. Задача. Напишите программу, в которой пользователь вводит число, а программа проверяет, делится ли это число на 3 и на 7....

Почему не срабатывает скрипт?
Добрый день! Написал скрипт для Tampermonkey Firefox который открывает все ссылки в отдельном окне (вкладке). Вот код: ...

Почему не срабатывает событие?
Подскажите почему не срабатывает событие? using System; using System.Collections.Generic; using System.ComponentModel; using...

почему-то не срабатывает Getdocumentbykey
Подскажите плиз. имеется форма Склад, с 2мя одинаковыми по типу полями(текстовые, первое - артикул, второе - название). существуют...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru