Volatile关键字
Volatile 关键字的作用是变量在多个线程之间可见。
该程序,主线程中已经将传入参数改为了"false",可是程序并不会终止执行。
原因:线程之间是不可见的,线程读取的共享变量是主内存的副本(线程本地内存),没有及时读取到主内存的最新结果。
解决办法:使用Volatile 关键字解决线程之间的可见性,强制线程每次读取该值的时候都去主内存中取值。
注:Volatile是非原子性的,不能保证线程安全,如:
该程序本意是启动十个线程,每个线程将静态变量的结果加1000,由于Volatile是非原子性,不能保证线程安全,所以运行结果有误,如:
解决这个问题,可以使用并发包中 AtomicInteger 来解决,如:
Volatile与synchronized的区别
仅靠volatile 不能保证线程的安全性。(原子性)
1.volatile 轻量级,只能修饰变量,synchronized 重量级,不仅能修饰变量,还可以修饰方法。
2.volatile 只能保证数据的可见性,不能用来做同步,因为多个线程并发访问volatile 修饰的变量不会阻塞。
synchronized不仅可以保证可见性,而且还保证原子性。因为,只有获得锁的线程才能进入临界区。
从而保证临界区中所有的语句全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。
线程安全性
线程安全性包括两个方面,①可见性,②原子性
从上面自增的例子中可以看出,仅仅使用volatile 并不能保证线程安全性。而synchronized 则可以实现线程安全性。