System.out.println当输出一个属性的时候是会读相关属性的真实内存地址上的数据同时做一次同步
来源:互联网 发布:智慧树网络课答案2017 编辑:程序博客网 时间:2024/06/05 00:37
package com.yikuyi.volatileTest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RunThread extends Thread{
private static final Logger logger = LoggerFactory.getLogger(RunThread.class);
private boolean running = true;
private int a = 0;
private void setRunning(boolean running){
System.out.println("&&&&&&&&&&&&&&&&----setRunning-----"+Thread.currentThread().getName());
this.running = running;
}
@Override
public void run(){
System.out.println("进入run方法......");
System.out.println("----run-------"+Thread.currentThread().getName()+"--------running:"+running);
while(running){
// System.out.println("--------while--------"+Thread.currentThread().getName()+"----------"+running);
a++;
}
System.out.println("线程停止"+"--------------------"+Thread.currentThread().getName());
}
public static void main(String[] args) throws InterruptedException {
RunThread runThread = new RunThread();
runThread.start();
Thread.sleep(3000);
runThread.setRunning(false);
System.out.println("--------running-----set-----false-----");
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"************"+runThread.running+"**********");
}
}
楼主,你这个问题其实很常见,这个是由java虚拟机的机制导致的,虚拟机为了效率,在处理线程类的属性时会创建一个临时属性,比如你一个线程类有一个子属性int a,在线程高速运行的时候,线程外部对这个a的修改并不能及时传达至内部,因为是非原子操作,同样线程内部对这个a 的修改也不能及时传达至外部,因为在线程外部调用这个属性a和线程内部调用这个属性a其实不是一个内存地址,只是看起来是同一个变量罢了,这个类似一种线程内部的缓存机制,可以确定的是当这个线程运行结束时,这个属性的值才会统一,至于在线程运行期间这个属性的值是不是能同步是不确定的,解决的办法可以采用sleep,你那个System.out.println也算是一种解决办法,我理解的当输出一个属性的时候是会读相关属性的真实内存地址上的数据同时做一次同步,除了这两个看起来不雅的办法,还可以用原子操作来解决可以参考下 AtomicInteger 这个类的api,这个类是一个原子操作的类,可以确保你多线程运行过程中内部和外部数据的统一,但是也略微降低了程序效率
查看地址:http://bbs.csdn.net/topics/391077210?page=1
- System.out.println当输出一个属性的时候是会读相关属性的真实内存地址上的数据同时做一次同步
- System.out.println 的输出顺序..
- logcat监听System.out.println()的输出
- 更改System.out.println()的输出路径
- 关于使用System.out.println()向控制台输出数据和使用out.println()向页面输出数据效率的问题
- System.out.println的误解
- android的System.out.println
- System.out.println的快捷键
- 将System.out.println()打印的内容输出到文件
- Logcat中查看System.out.println()输出的内容(转)
- hadoop中System.out.println输出内容的查看
- System.out.println与System.err.println的区别(输出顺序!!!)
- 【JAVA学习】解释一个简单的语句 System.out.println
- System.out.println与System.err.println的区别
- System.out.println与System.err.println的区别
- System.out.println和System.err.println的区别
- System.out.println与System.err.println的区别
- System.out.println和System.err.println的区别
- maven setting 阿里仓库
- listview条目未满全屏时,button在listviwe下方,条目超过屏幕时,button在屏幕底端
- CMake/Tutorials/Exporting and Importing Targets
- IDEA中Spring Boot项目MyBaits提示Invalid bound statement (not found)错误
- 1.JAVA 基本算法:冒泡排序法--详讲
- System.out.println当输出一个属性的时候是会读相关属性的真实内存地址上的数据同时做一次同步
- tomcat中C++线程调用java出现ClassDefNotFound
- Appache下 创建SVN账号(针对具体项目)
- 实现 “再按一次退出” 功能
- JavaScript 多选框多选与取消多选两种写法
- CCF CSP 有趣的数
- Java实现Excel导入数据库,数据库中的数据导入到Excel
- 分布式监控解决方案zabbix03-监控mysql
- 阿里巴巴开源项目: 基于mysql数据库binlog的增量订阅&消费