silvermyth

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  1 随笔 :: 12 文章 :: 1 评论 :: 0 Trackbacks
 
    我们知道,在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作,也就是说,对于变量值的简单读写操作没有必要进行同步。这在JVM 1.2之前,Java的内存模型实现总是从主存读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要。在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。把变量声明为volatile(不稳定的),这就指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。一般说来,多任务环境下各任务间共享的标志都应该加volatile修饰。
    在一些情况下,使用volatile可以达到同步的目的,在某种程度上相当于synchronized关键字;为什么说是一定程度上呢,这就要从synchronized同步关键字说起了,synchronized在Java语言中可以实现两个功能,互斥性和可见性。互斥性是指任意时刻只能有一个线程持有特定的锁,从而可以实现对共享数据的协调访问;而可见性说的是,任意线程修改的共享数据对于其他线程必须是可见的,也就是说不允许其他线程拿到旧的数据。而volatile关键字只能实现可见性,也就是说用volatile修饰的变量的修改对于其他线程是可见的,如果该值被修改,其他线程可以立即得到新值。下面的代码简单展示了volatile的一个简单应用,线程的退出:
    
 1public 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 阅读(171) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: