Проверка в 40 строке необходима для того, чтобы каждое предложение было принято только 1 раз. Если thisProposal == proposal, то это означает, что сделанное предложение proposal уже было принято; неравенство этих переменных означает, что было сделано новое предложение (значение proposal увеличилось на 1), и его необходимо принять.
Спасибо! Но я ведь ве таки не понимаю. Смотри, изначально proposal = 0, первозапущенный поток AcceptProposal нам не выдаст никакого текста ведь 0 будет равняться 0. После него, запускается второй поток, точнее они как бы одновременно запускаются, и внутри while инкрементит значение proposal на 1 каждый раз пока не достигнет 10. Поэтому мы и делали volatile чтобы и в потоке AcceptProposal переменная proposal была изменена, но ведь когда она войдет со значением 1, она присваивает на строке 37 значение 1 к thisProposal и получается, что они равны. У меня вопрос к этой системе как они получаются неравны. Мне нужно это просто реально понять, чтобы отложилось.
Не совсем так. Поскольку поток AcceptProposal был запущен первым, то строка 37 выполнялась при значении proposal, равном нулю. Эта строка выполняется только один раз при инициализации потока AcceptProposal. При этом значение переменной thisProposal также устанавливается в 0. После этого поток "крутится" в цикле до тех пор, пока другой поток не изменит значение глобальной переменной proposal (в этом случае имеем неравенство 0 != 1). Предложение принимается, значение переменной thisProposal выравнивается со значением переменной proposal. Затем поток MakeProposal просыпается, снова увеличивает значение proposal на 1, и цикл повторяется.