2 xiaoyagouwei xiaoyagouwei 于 2016.04.17 10:48 提问

关于println和sleep 会在不适用volatile 关键字的情况下跳出循环?

package com.test;

import java.util.concurrent.TimeUnit;

public class test1 {

private static boolean is = true;
public static void main(String[] args) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            int i = 0;
            while(test1.is){
                i++;
                //println 是synchronized 的,会强制刷新住内存的变量值到线程栈?
                System.out.println("1");
                /* 
                 * sleep 会使is的值 在线程栈中失效,从新load 住内存的值? 
                 try {
                    TimeUnit.MICROSECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();  
                }*/
            } 
        }
    }).start();
     try {
        TimeUnit.MICROSECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();  
        }
    new Thread(new Runnable() {
        @Override
        public void run() {
            is = false;

        }
    }).start();

}

}

上面这段代码,在循环中加入println 或者 sleep 都会使循环终止。为什么?

1个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.04.17 11:14

循环跳出主要是因为你的后面一段代码中开启的一个线程将is这个变量的值设置为false了。
本质上你开了两个线程,第一个线程while(test1.is)循环判断is是否为true,只有true才会继续循环,现在另一个线程将is设置为false之后,那么你的第一个线程while条件判断为false了,当然就跳出循环,操作结束了啊。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
volatile的适用场景(面试问题:volatile有什么作用)
把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility)。 原子性意味着个时刻,只有一个线程能够执行一段代码,这段代码通过一个monitor object保护。从而防止多个线程在更新共享状态时相互冲突。可见性则更为微妙,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的。 —— 如果
java volatile关键字(及使用场景)
当一个变量被定义为volatile之后,就可以保证此变量对所有线程的可见性,即当一个线程修改了此变量的值的时候,变量新的值对于其他线程来说是可以立即得知的。可以理解成:对volatile变量所有的写操作都能立刻被其他线程得知。但是这并不代表基于volatile变量的运算在并发下是安全的,因为volatile只能保证内存可见性,却没有保证对变量操作的原子性。比如下面的代码:  /**
c语言volatile关键字在单片机中的作用
volatile 的意思是“易失的,易改变的”。这个限定词的含义是向编译器指明变量的内容可能会由于其他程序的修改而变化。通常在程序中申明了一个变量时,编译器会尽量把它存放在通用寄存器中,例如ebx。当CPU把其值放到ebx中后就不会再关心对应内存中的值。若此时其他程序(例如内核程序或一个中断)修改了内存中它的值,ebx中的值并不会随之更新。为了解决这种情况就创建了volatile限定词,让代码在引...
volatile的使用条件
volatile的使用条件 Volatile 变量具有 synchronized 的可见性特性,但是不具备原子性。这就是说线程能够自动发现 volatile 变量的最新值。 Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器、互斥锁或任何具有与多个变量相
C语言关键字volatile(不知道的别说你是干嵌入式的)
我在网上看见一个帖子说回答不出这个问题的人是不会被雇佣的。这是区分C程序员和嵌入式系统程序员的最基本的问题。搞嵌入式的家伙们经常同硬件、中断、RTOS等打交道,所有这些都要求用到volatile变量。下面来看下面试题中提到的问题(答案我从网络整理,以便复习): 关键字volatile有什么含意?并给出三个不同的例子。 volatile的本意是“易变的” 由于访问寄存器的速度要快过RAM
Java线程安全之volatile关键字
我们知道在多线程的场景下,线程安全是必须要着重考虑的。Java语言包含两种内在的同步机制:同步块(synchronize关键字)和 volatile 变量。但是其中 Volatile 变量虽然使用简单,有时候开销也比较低,但是同时它的同步性较差,而且其使用也更容易出错。
volatile使用场景
一.前言1.编译器优化介绍:由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内存变...
Java——多线程总结、ThreadLocal/Volatile/synchronized/Atomic关键字
当线程被创建并启动之后,它既不是一启动就进入执行状态,也不是一直处于执行状态,在其生命周期中,要经过”新建(New)”、”就绪(Runnable)”、”运行(Running’)”、”阻塞(Blocked)”和”死亡(Dead)”五种状态。线程在创建之后,不可能一直霸占着CPU独立运行,需要在多个线程之间切换,所以大部分时间处于运行、阻塞之间切换。Thread类中和这四种状态相关的方法: //
关键字volatile的作用和三个不同的应用场合
学习C关键词的时候,我们看到了一个新面孔——volatile。在程序员面试宝典中提到“关键字volatile的面试例题是考查嵌入式编程”,中间有一段解析: 回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,所有这些都要求用到volatile变量。不懂得volatile的内容将会带来灾难。 假设被面
volatile不能保证原子性
volatile