Volatile关键字

Volatile 关键字的作用是变量在多个线程之间可见。

该程序,主线程中已经将传入参数改为了"false",可是程序并不会终止执行。

原因:线程之间是不可见的,线程读取的共享变量是主内存的副本(线程本地内存),没有及时读取到主内存的最新结果。

解决办法:使用Volatile 关键字解决线程之间的可见性,强制线程每次读取该值的时候都去主内存中取值。

注:Volatile是非原子性的,不能保证线程安全,如:

该程序本意是启动十个线程,每个线程将静态变量的结果加1000,由于Volatile是非原子性,不能保证线程安全,所以运行结果有误,如:

解决这个问题,可以使用并发包中 AtomicInteger 来解决,如:

Volatile与synchronized的区别

仅靠volatile 不能保证线程的安全性。(原子性)

1.volatile 轻量级,只能修饰变量,synchronized 重量级,不仅能修饰变量,还可以修饰方法。

2.volatile 只能保证数据的可见性,不能用来做同步,因为多个线程并发访问volatile 修饰的变量不会阻塞。

   synchronized不仅可以保证可见性,而且还保证原子性。因为,只有获得锁的线程才能进入临界区。

   从而保证临界区中所有的语句全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。 

线程安全性

线程安全性包括两个方面,①可见性,②原子性

从上面自增的例子中可以看出,仅仅使用volatile 并不能保证线程安全性。而synchronized 则可以实现线程安全性。

原文地址:https://www.cnblogs.com/zyybb/p/10973658.html