Управление системной консолью при помощи ожидания / уведомления / синхронизации - PullRequest
0 голосов
/ 06 января 2012

Ладно, ребята, посмотрите, это простой пример, который я сделал. Я пытаюсь научиться лучше синхронизации, но у меня есть один вопрос здесь ... почти всегда я получаю на консоли желаемый результат:

Here they go!...2001ms
Mares eat oats - t1  3001ms
Mares eat oats - t2  4001ms
Does eat oats - t1  5001ms
Does eat oats - t2  6001ms

но иногда нет ... Я получаю что-то вроде этого:

Here they go!...2000ms
Mares eat oats - t2  3000ms
Does eat oats - t2  3000ms
Mares eat oats - t1  4000ms
Does eat oats - t1  6001ms

Может кто-нибудь объяснить мне? Может потому что у меня 2 ядра? у меня есть окно 7 intel corei5

если вам, ребята, нужен мой код, он здесь, маленький, не для больших парней ..

http://pastebin.com/nLczry9R

просто нужен хороший ответ, почему это происходит, большое спасибо, ребята! хочу понять это немного больше, синхронизация потоков. извините, мой плохой английский, большое спасибо заранее.

1 Ответ

1 голос
/ 06 января 2012

Почему вы синхронизируете методы? Если вы сделаете это, каждый раз, когда вы вызываете метод, весь класс блокируется (на wait ()) из монитора потоков (поскольку Monitor относится к классу Useless). Вместо этого используйте synchronize(b) { .... } внутри методов u1 и u2. И «b», вероятно, не обязательно должно быть «статичным».

Посмотрите на это введите описание ссылки здесь для лучшего объяснения.

Я думаю, что ваша проблема в том, что:

  1. b является статическим
  2. синхронизируется с методами вместо объекта блокировки (или блокировки монитора)
  3. Вы вызываете u.u2 два раза, но при первом вызове он освобождает все потоки, заблокированные на мониторе «Бесполезный». Таким образом, есть условие гонки, и первая нить, которая победит, может быть t2 или t1

Итак, попробуйте:

  1. изменить b на нестатическую переменную
  2. использовать синхронизацию (б) {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...