Uses of volatile without synchronization

后端 未结 3 740
长情又很酷
长情又很酷 2021-01-11 14:15

Knowing that

Reads and writes are atomic for all variables declared volatile

Question1: Can this be understood

3条回答
  •  慢半拍i
    慢半拍i (楼主)
    2021-01-11 14:46

    As a quickly testable example that may illustrate the previous answers, this yields always a final count of 8:

    import java.util.concurrent.atomic.AtomicInteger;
    
    
    public class ThreadTest_synchronize {
    
    public static void main(String[] args) {
    
        ThreadTest_synchronize tt = new ThreadTest_synchronize ();
        try {
            tt.go();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    
    }
    
    private void go() throws InterruptedException{
    
        MyRunnable t = new MyRunnable();
        Thread myThread_1 = new Thread( t, "t1");
        Thread myThread_2 = new Thread( t, "t2");
        myThread_1.start();
        myThread_2.start();
        myThread_1.join();
        myThread_2.join();
        System.out.println("Processing count="+t.getCount());       
    
    }
    
    private class MyRunnable implements Runnable{
    
        private AtomicInteger count=new AtomicInteger(0);
    
        @Override
        public  void run() {
            for(int i=1; i< 5; i++){
                doSomething(i);
                count.getAndAdd(1);
            }           
        }
    
    
        public AtomicInteger getCount() {
            return this.count;
        }
    
    
        private void doSomething(int i) {
            try {
                Thread.sleep(i*300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }       
    
    }
    

    while this generally does not:

    public class ThreadTest_volatile {
    
    public static void main(String[] args) {
    
        ThreadTest_volatile tt = new ThreadTest_volatile ();
        try {
            tt.go();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    
    }
    
    private void go() throws InterruptedException{
    
        MyRunnable t = new MyRunnable();
        Thread myThread_1 = new Thread( t, "t1");
        Thread myThread_2 = new Thread( t, "t2");
        myThread_1.start();
        myThread_2.start();
        myThread_1.join();
        myThread_2.join();
        System.out.println("Processing count="+t.getCount());       
    
    }
    
    private class MyRunnable implements Runnable{
    
        private volatile int count = 0;
    
    
        @Override
        public  void run() {
            for(int i=1; i< 5; i++){
                doSomething(i);
                count++;
            }
    
        }
    
        private  int add(int count){
            return ++count;
        }
    
    
        public int getCount(){
            return count;
        }
    
        private void doSomething(int i) {
    
            try {
                Thread.sleep(i*300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    }
    

提交回复
热议问题