Павел Дуденков:
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();
}
И вместо finish - можно использовать petrov.join();
И я бы был тебе очень благодарен если бы ты разобрался, почему не работает с простым Integer
и объяснил мне.)))) потому как это я уже не понимаю....
соответственно синхронизироваться по нему бессмысленно и происходит такая вот картина