当前位置: 技术问答>java相关
请教volatile关键字的用法!!!
来源: 互联网 发布时间:2015-02-17
本文导语: 由于本人英语水平有限,我在《Java Language Specification Second Edition》看了几遍还是不能完全理解“volatitle”的具体用法,是不是限制线程互斥访问其修饰的变量?但那本书讲的好象没那么简单。请高手指教!! ...
由于本人英语水平有限,我在《Java Language Specification Second Edition》看了几遍还是不能完全理解“volatitle”的具体用法,是不是限制线程互斥访问其修饰的变量?但那本书讲的好象没那么简单。请高手指教!!
|
volatitle大概是为了“数据同步”,即保证内存中的数据(在不同的thread中的)可视性,
Doug Lea在> 2版中解释的较好,小衲我。。。
(咬咬牙)。。。咳咳咳咳咳。。。大概是这样的。。。
首先,Java有一个内存模型,这个模型是从Java程序员的眼里看到的,对CPU(单个或多个)/寄
存器/内cache/外cache/主内存/。。。/OS管理内存机制。。。等各方面的一个抽象,但这方面
的spec好象不是很多
根据这个模型,大概是有一个“主内存”,数据在“主内存”中有一个“主copy”,
每一个thread有一个“工作内存”,其中有该数据的“工作copy",在这里,这些
“主内存”/“工作内存”都是从Java看出去的抽象概念,不一定对应于一个硬件
或OS的实体
一个volatitle变量,在加上正确运用synchronized,应该是可以保证当这个变量在
某个thread中被改变了之后,这个变化对其他thread是”可视的“,即这个变量的”
主内存copy"和各个“工作copy”是同步刷新的
所以把一个变量定义为volatitle,在加上正确运用synchronized,理论上可以保证
这个变量在各个thread中都是一致的,这里变了,那里也就跟着变了。但实际上比较
复杂(特别是在不同的硬件/OS平台上,如4个intelCPU的nt40机器),最好还要加上
其他措施,和volatitle一起用,这样才能达到“数据同步”的目的
Doug Lea在> 2版中解释的较好,小衲我。。。
(咬咬牙)。。。咳咳咳咳咳。。。大概是这样的。。。
首先,Java有一个内存模型,这个模型是从Java程序员的眼里看到的,对CPU(单个或多个)/寄
存器/内cache/外cache/主内存/。。。/OS管理内存机制。。。等各方面的一个抽象,但这方面
的spec好象不是很多
根据这个模型,大概是有一个“主内存”,数据在“主内存”中有一个“主copy”,
每一个thread有一个“工作内存”,其中有该数据的“工作copy",在这里,这些
“主内存”/“工作内存”都是从Java看出去的抽象概念,不一定对应于一个硬件
或OS的实体
一个volatitle变量,在加上正确运用synchronized,应该是可以保证当这个变量在
某个thread中被改变了之后,这个变化对其他thread是”可视的“,即这个变量的”
主内存copy"和各个“工作copy”是同步刷新的
所以把一个变量定义为volatitle,在加上正确运用synchronized,理论上可以保证
这个变量在各个thread中都是一致的,这里变了,那里也就跟着变了。但实际上比较
复杂(特别是在不同的硬件/OS平台上,如4个intelCPU的nt40机器),最好还要加上
其他措施,和volatitle一起用,这样才能达到“数据同步”的目的