Главная

Java

Многопоточность




volatile :

Применяется к полю(fild) для того чтобы не использовать кэш данные , а читать значения напрямую из памяти.

Можно использовать если один поток читает, а другой поток изменяет значение. (Thread safe)

Чтение и запись volatile переменной является потокобезопасной(Thread safe) операцией , а остальные (инкремент , декремент и т.д. ) являются потоко-не-безопасными !!!

инкремент переменной , такой как x=x+1 выгладит как одна операция , однако , на самом деле это последовательность операций чтения-изменения-записи !!!



пример :


public class BadVolatile {

    private static int i;
//   private volatile static int i;

    public static void main(String[] args) {
        new MyThreadRead().start();
        new MyThreadWrite().start();

    }

    private static class MyThreadWrite extends Thread{

        @Override
        public void run() {
            while (i<8){
                System.out.println("increment i " + (++i));
                try {
                    Thread.sleep(512);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }
    private static class MyThreadRead extends Thread{

        @Override
        public void run() {
            int localVar = i;

            while (localVar < 8){
                if(localVar!=i){
                    System.out.println("new value of i is "+ i);
                    localVar = i;

                }

            }
        }}
}



Полезные ссылки: