"Why doesn't my code work without volatile?"
08:03 24 Dec 2025
public class NT8 extends Thread{

    NT8(String ime, int prioritet){
        super(ime);
        setPriority(prioritet);
        start();
    }

    @Override
    public void run() {
        while(signal){
            brojac++;
        }
        System.out.println(currentThread().getName()+" je zavrsena!");
    }

    void promeni(){
        signal = false;
    }



    static void main(String[] args) throws InterruptedException{
        NT8 n1 = new NT8("Prva nit",5);
        NT8 n2 = new NT8("Druga nit",5);
        long ukupanBroj;
        System.out.println("Glavna nit spava");
        Thread.sleep(10000);
        System.out.println("Glavna nit se budi");
        System.out.println(n1.signal);
        n1.promeni();
        System.out.println(n1.signal);
        System.out.println(n2.signal);
        n2.promeni();
        System.out.println(n2.signal);
        n1.join();
        n2.join();


        ukupanBroj = n1.brojac+n2.brojac;
        System.out.println(n1.getName()+ " zauzima ukupno "+(double)(n1.brojac*100.00)/ukupanBroj+"%");
        System.out.println(n2.getName()+ " zauzima ukupno "+(double)(n2.brojac*100.00)/ukupanBroj+"%");
    }

    private volatile boolean signal = true;
    long brojac = 0;
}

Look at my code. It shows how much processing time each of my two threads uses. I have a question: why doesn't this code work as expected if I declare

private boolean signal = true

instead of

private volatile boolean signal = true;

I know that volatile ensures visibility of changes between threads, but in this case each thread has its own signal variable.

java multithreading boolean private volatile