
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
多线程编程开发是随着互联网的不断发展而被众多程序员都在学习使用的一种编程方式,而今天我们就通过案例分析来了解一下,java多线程编程开发volatile关键字应用。
1.多线程下变量不可见性
多线程并发执行下,多个线程修改共享的成员变量,会出现一个线程修改了共享变量的值后,另一个线程不能直接看到该线程修改后的变量的新值。
2.变量不可见性内存语义
多线程并发修改变量不可见现象的原因之前,我们需要了解回顾一下Java内存模型(和Java并发编程有关的模型):JMM;
JMM(JavaMemoryModel):Java内存模型,是java虚拟机规范中所定义的一种内存模型,Java内存模型是标准化的,屏蔽掉了底层不同计算机的区别;
Java内存模型描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取变量这样的底层细节。
3.JMM有以下规定
共享变量都存储于主内存。这里所说的变量指的是实例变量和类变量。不包含局部变量,因为局部变量是线程私有的,因此不存在竞争问题;
每一个线程还存在自己的工作内存,线程的工作内存,保留了被线程使用的变量的工作副本;
线程对变量的所有的操作(读,取)都必须在工作内存中完成,而不能直接读写主内存中的变量;
不同线程之间也不能直接访问对方工作内存中的变量,线程间变量值传递需要通过主内存中转来完成;
4.volatile与synchronized的区别
volatile只能修饰实例变量和类变量,而synchronized可以修饰方法,以及代码块
volatile保证数据的可见性,但是不保证原子性(多线程进行写操作,不保证线程安全);而synchronized是一种排他(互斥)的机制
volatile用于禁止指令重排序:可以解决单例双重检查对象初始化代码执行乱序问题
volatile可以看做是轻量版的synchronized,volatile不保证原子性,但是如果是对一个共享变量进行多个线程的赋值,而没有其他的操作,那么就可以用volatile来代替synchronized,因为赋值本身是有原子性的,而volatile又保证了可见性,所以就可以保证线程安全了
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。