Java线程 - Synchronized、Volatile

2018-04-11  本文已影响0人  52HzBoo

Synchronized特性

JMM关于synchronized的两条规定:

Synchronized实现可见性

可见性

代码案例,实现非线程安全

public class SynchronizedDemo {
    //共享变量
    private boolean ready = false;
    private int result = 0;
    private int number = 1;   
    //写操作 加上 synchronized 可保证线程原子性
    public void write(){
        ready = true;                        //1.1              
        number = 2;                         //1.2               
    }
    //读操作 加上 synchronized 可保证线程原子性
    public void read(){              
        if(ready){                           //2.1
            result = number*3;      //2.2
        }       
        System.out.println("result的值为:" + result);
    }

    //内部线程类
    private class ReadWriteThread extends Thread {
        //根据构造方法中传入的flag参数,确定线程执行读操作还是写操作
        private boolean flag;
        public ReadWriteThread(boolean flag){
            this.flag = flag;
        }
        @Override                                                                    
        public void run() {
            if(flag){
                //构造方法中传入true,执行写操作
                write();
            }else{
                //构造方法中传入false,执行读操作
                read();
            }
        }
    }

    public static void main(String[] args)  {
        SynchronizedDemo synDemo = new SynchronizedDemo();
        //启动线程执行写操作
        synDemo .new ReadWriteThread(true).start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //启动线程执行读操作
        synDemo.new ReadWriteThread(false).start();
    }
}

Volatile特性

Volatile使用场景

要在多线程中安全的使用volatile变量,必须同时满足:

1.对变量的写入操作不依赖于其当前值
即改变后的volatile变量的值不能与它之前的值有关系.

2.该变量没有包含在具有其他变量的不变式中.
即不能存在通过volatile变量进行逻辑判断.

上一篇 下一篇

猜你喜欢

热点阅读