Рекурсия переменной глубины в Java - PullRequest
1 голос
/ 24 января 2011

Итак, я провожу небольшой эксперимент, чтобы выяснить, насколько далеко может зайти рекурсия в языке Java, поскольку я беру урок по параллелизму и изучаю механизмы потоков Java.Прямо сейчас я использую четырехъядерный процессор Intel i5 с 2,8 ГГц и 4 ГБ оперативной памяти.Я работаю на Windows 7 с x64 и в Eclipse со стандартным JRE?Не уверен насчет последней части, которую я только что скачал с веб-сайта Sun.

В любом случае,

public class StacksizeTest implements Runnable {

int depth = 0;

public void run()
{
    try
    {
        doOverflow();
    }
    catch (StackOverflowError e)
    {
        System.out.print("Overflow ocurred at depth " + depth + ".\n");
    }
}

void doOverflow()
{
    depth += 1;
    doOverflow();
}

public static void main(String argv[])
{
    Thread mt = new Thread(new StacksizeTest());
    mt.start();
    mt.run();
}   
}

Я также работаю с размером стека вызовов по умолчанию, который, я уверен, составляет 512 МБ в соответствии св файл настроек.

Поэтому, когда я запускаю программу и запускаю новый поток, я продолжаю получать переменную глубину, а также печатать оператор печати дважды.Я думаю, что оператор print имеет смысл, потому что он должен запускать mt в новом потоке.Что меня смущает, так это если я исключаю .start () и просто вызываю .run (), «глубина» всегда одинакова (около 11 500 или около того), но когда я использую .start (), я получаю переменную глубину,пара была 22789, 22330 и 22381. Мне трудно понять, почему это так.Может ли кто-нибудь пролить свет на этот вопрос?

Спасибо,

Мэтт

Ответы [ 2 ]

4 голосов
/ 24 января 2011

При вызове .start() начнется новый поток с run(), , затем вы снова вызываете run() в основном потоке Таким образом, у вас одновременно работают два потока глубины стека. Поскольку у вас также есть общая переменная, подсчитывающая глубину, которая не защищена синхронизированным мьютексом, у вас есть классическая проблема конфликта переменных.

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

0 голосов
/ 24 января 2011

Когда вы вызываете start(), вы запускаете метод асинхронно, поэтому вы запускаете его дважды, потому что start() в конце концов вызывает run(), и, кроме того, вы сами вызываете run()так что у вас есть два потока, увеличивающие ваш счетчик depth.Исключите start(), и вы получите меньшее количество, потому что вы используете только один поток.

РЕДАКТИРОВАТЬ: Я только что увидел ответ Грега.Мне нравится его больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...