• Многопоточность не завершается?

    @pbahushevich
    Урааааа - я понял )))) в Java Integer - немутабельный тип. Т.е каждый раз когда ты меняешь значение происходит примерно следующее:
    Integer n =10;  // Integer n = new Integer.valueOf(10);
    n = 11;             // n = new Integer.valueOf(11);
    n = n+1;          // n = new Inger.valueOf(n.intValue()+1);

    соответственно синхронизироваться по нему бессмысленно и происходит такая вот картина
  • Многопоточность не завершается?

    @pbahushevich
    Павел Дуденков:
    volatile - обещает то что операции записи и чтения будут атомарными. Т.е. если пока твой поток пишет int другой поток его не перепишет, т.к. при записи longa насколько я знаю, операция записи старших байт может происходить отдельно от операции записи младших.
    i++ это операция чтения, вычисления (+1) и затем записи, т.е. тут 3 операции и volatile тут не спасает.
    Для этого есть такой класс как AtomicInteger. Плюс у тебя блок сравнения totalSounds и увеличения должен находиться в одном synchronized.
    synchronized метод класса - вызывается с блокировкой монитора на "this" (на текущем экземпляре). Ты же меняешь статическую переменную класса, которая не привязана к объекту, соответственно synchronized метод тут не поможет.
    Если переписать вот так то работает.

    public static class Politic extends Thread {
    public volatile static AtomicInteger totalSounds = new AtomicInteger(0);
    private volatile int countSounds;
    public volatile boolean finish = false;

    public Politic(String name) {
    super(name);
    start();
    }

    public void run() {
    while (true) {
    synchronized (totalSounds) {
    if(totalSounds.get() >= totalCountSpeeches * soundsInOneSpeech) {
    break;
    }
    countSounds++;
    totalSounds.getAndIncrement();
    }
    }
    finish = true;
    }

    И вместо finish - можно использовать petrov.join();
    И я бы был тебе очень благодарен если бы ты разобрался, почему не работает с простым Integer
    и объяснил мне.)))) потому как это я уже не понимаю....
  • Многопоточность не завершается?

    @pbahushevich
    Павел Дуденков: о, "visibility problem" прям как на картинке )))))
  • Многопоточность не завершается?

    @pbahushevich
    Павел Дуденков: а понял, просто создается впечатление что кандидаты должны разделить 200 голосов между собой))