silvermyth
BlogJava
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
1 随笔 :: 12 文章 :: 1 评论 :: 0 Trackbacks
<
2024年11月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
给我留言
查看公开留言
查看私人留言
文章分类
C/C++
(rss)
Java(3)
(rss)
JavaScript(1)
(rss)
Php(1)
(rss)
Python
(rss)
中间件
(rss)
云计算
(rss)
其它(1)
(rss)
分布式(1)
(rss)
大数据
(rss)
数据库
(rss)
架构(3)
(rss)
设计模式(3)
(rss)
运维
(rss)
文章档案
2017年4月 (2)
2017年3月 (2)
2015年7月 (3)
2011年6月 (4)
搜索
最新评论
1. re: 闲话Java设计模式三:命令模式
BoyFriend怎么没有定义啊? 不好意思
--Philip
Volatile的一种简单应用
我们知道,在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作,也就是说,对于变量值的简单读写操作没有必要进行同步。这在JVM 1.2之前,Java的内存模型实现总是从主存读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要。在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。把变量声明为volatile(不稳定的),这就指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。一般说来,多任务环境下各任务间共享的标志都应该加volatile修饰。
在一些情况下,使用volatile可以达到同步的目的,在某种程度上相当于synchronized关键字;为什么说是一定程度上呢,这就要从synchronized同步关键字说起了,synchronized在Java语言中可以实现两个功能,互斥性和可见性。互斥性是指任意时刻只能有一个线程持有特定的锁,从而可以实现对共享数据的协调访问;而可见性说的是,任意线程修改的共享数据对于其他线程必须是可见的,也就是说不允许其他线程拿到旧的数据。而volatile关键字只能实现可见性,也就是说用volatile修饰的变量的修改对于其他线程是可见的,如果该值被修改,其他线程可以立即得到新值。下面的代码简单展示了volatile的一个简单应用,线程的退出:
1
public
class
Monitor
implements
Runnable
{
2
3
private
volatile
Thread blinker;
4
boolean
isRunning
=
false
;
5
6
7
@Override
8
public
void
run()
{
9
10
Thread thisThread
=
Thread.currentThread();
11
while
(blinker
==
thisThread)
{
12
try
{
13
thisThread.sleep(
50
);
14
}
catch
(InterruptedException e)
{
15
}
16
//
To do you task
17
}
18
19
}
20
21
22
public
void
startMonitor()
{
23
blinker
=
new
Thread(
this
);
24
blinker.start();
25
}
26
27
public
void
stopMonitor()
{
28
blinker
=
null
;
29
}
30
31
}
posted on 2011-06-14 22:53
Gavin Li
阅读(182)
评论(0)
编辑
收藏
所属分类:
Java
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
相关文章:
Swing Worker应用举例
Volatile的一种简单应用
Java中List的安全删除
Powered by:
BlogJava
Copyright © Gavin Li