博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程可见性与原子性
阅读量:6463 次
发布时间:2019-06-23

本文共 1324 字,大约阅读时间需要 4 分钟。

1. 可见性

多个线程之间不能直接传递数据,它们之间的服务只能通过共享数据来传递。在com.yding.process包下的Count和ThreadTest,由于多个线程之间共享了Count对象,count仍然是在主内存中(堆内存),每个线程有自己的工作内存,也就是栈内存。每个线程存储的是count对象的一个副本,当线程修改count对象时,首先从主内存中复制count对象到自己的栈内存,修改完后,再将工作内存的值刷新到主内存中。

 2. 有序性

多个线程执行时,cpu对线程的调度是随机的。一个经典的例子是:银行取钱,假设两个人,一个取10元,另一个人存10元,原来的余额是100元。这时候,A取10元,100-10=90;B存10元,本来,最后的余额应该是100元,但A取出10元后,B开始执行;B执行到一半停下来,A开始执行,把90刷新到主内存中,B开始执行,将110刷新到主内存中,这时候就出现问题了

3.代码展示:

public class Outputter {    public void output(String str){        for(int i = 0; i < str.length();i++){            System.out.print(str.charAt(i));        }    }    }
public class Main {        public static void main(String[] args) {        Outputter outputter = new Outputter();        new Thread(){            public void run(){                outputter.output("chinaese ");            }        }.start();        new Thread(){            public void run(){                outputter.output("chinaese ");            }        }.start();        new Thread(){            public void run(){                outputter.output("chinaese ");            }        }.start();        new Thread(){            public void run(){                outputter.output("chinaese ");            }        }.start();    }}

输出结果:

chinaese chinaese cchinhinaese aese

很明显,线程有序性也是一个难题。

 

转载于:https://www.cnblogs.com/lfdingye/p/7443150.html

你可能感兴趣的文章
EJB2的配置
查看>>
最容易理解的对卷积(convolution)的解释
查看>>
《机器学习实战》知识点笔记目录
查看>>
Linux操作系统实时性分析
查看>>
mysql导出导入所有数据库
查看>>
完美解决NC502手工sql的查询引擎排序及合计问题
查看>>
PHP+MySQL代码部署在Linux(Ubuntu)上注意事项
查看>>
Tiny语言执行环境TM机源码
查看>>
PE文件之资源讲解
查看>>
windows 7/mac编译cocos2d-x-3.2*的android工程报错
查看>>
MYSQL导入导出.sql文件(转)
查看>>
使用Elasticsearch、Logstash、Kibana与Redis(作为缓冲区)对Nginx日志进行收集(转)
查看>>
git review报错一例
查看>>
Tomcat在Linux上的安装与配置
查看>>
《信息安全系统设计基础》 课程教学
查看>>
Linux平台下使用rman进行oracle数据库迁移
查看>>
全栈工程师学习Linux技术的忠告
查看>>
iOS自定制tabbar与系统的tabbar冲突,造成第一次点击各个item图片更换选中,第二次选中部分item图片不改变...
查看>>
C# Dictionary用法总结
查看>>
SVN服务器使用(二)
查看>>