Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2011, 21:09   #1
--Serega--
 
Регистрация: 11.02.2011
Сообщений: 5
По умолчанию wait, notifyAll

Проблема решена.

Собственно, вопрос в следующем: почему данный код генерирует java.lang.IllegalMonitorStateExcept ion? Ведь когда вызывается метод count.notifyAll(), текущий поток является владельцем монитора count, и этого происходить не должно.

Код:
import java.io.*;
import java.util.*;

class MyRunnable implements Runnable {
	public static int maxNumber;
	public static int minNumber;
	public static Integer count = 0;
	public void run() {
		for (;;) {
			/*
			 * вместо комментария - код, который выполняет определённые действия.
			 */
			synchronized (count) {
				++count;
				if (count > maxNumber - minNumber + 1) {
					return;
				}
				System.out.println(Thread.currentThread() + " count was set to " + count);
				if (count == maxNumber - minNumber + 1) {
					count.notifyAll();
					return; 
				}
			}
		}
	}
}

public class Test {

	public static void main(String[] args) throws Exception {
		MyRunnable.minNumber = 1;
		MyRunnable.maxNumber = 10000;
		Thread[] threads = new Thread[2];
		for (int i = 0; i < threads.length; ++i) {
			threads[i] = new Thread(new MyRunnable());
		}
		for (int i = 0; i < threads.length; ++i) {	
			threads[i].start();
		}
		synchronized(MyRunnable.count) {
			MyRunnable.count.wait();
		}
	}
}

Последний раз редактировалось --Serega--; 23.11.2011 в 15:59.
--Serega-- вне форума Ответить с цитированием
Старый 20.12.2011, 10:12   #2
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

потому что вы используете переменную в качестве монитора, и изменяете ее. Т.к. Integer это immutable sequence, то код: count++ неизменно приведет к тому, что ссылка будет ссылаться на другой объект, а следовательно count.notifyAll() бросит исключение. Правильно будет завести отдельную (да еще и константную) ссылку на монитор.
sashonk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка lock conflict on no wait transaction пауэрлифтинг БД в Delphi 1 28.05.2010 00:19