首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

volatile的事例

2013-03-28 
volatile的例子package player.kent.chen.learn.hivolatile/** * 循环直到有人喊停 */public class LoopU

volatile的例子

package player.kent.chen.learn.hivolatile;/** * 循环直到有人喊停 */public class LoopUntilCommand {    private boolean stop;    /**     * 循环直到有人喊停     */    public void loop() {        while (!stop) {            ;        }        System.out.println("Stopped because somebody said so");    }    /**     * 喊停     */    public void sayStop() {        stop = true;    }    public static void main(String[] args) throws InterruptedException {        final LoopUntilCommand luc = new LoopUntilCommand();        Thread t = new Thread(new Runnable() {            public void run() {                luc.loop();            }        });        t.start(); //启动循环线程        Thread.sleep(1000);        luc.sayStop(); //喊停    }}


按照一般的理解,在执行luc.sayStop()之后,stop被置为true, luc.loop()跟着就会退出。

可是事实上,luc.loop()很有可能永不退出,陷入死循环,因为主线程对stop变量的改变不一定会被同步到t线程的工作内存中,导致t1线程永远发现不了这个变化,从而一直认为stop=false, 无限循环。

要解决这个问题,就要在声明stop变量时加上volatile关键字;使用volatile后,可以认为两个线程对stop变量不再存在各自的副本,所有读写直接发生在共享内存区; 这样的话,主线程对stop变量的修改会立即对t线程可见。

热点排行