多个线程直接按对数据进行操作容易引发线程安全问题
参考链接:http://www.cnblogs.com/paddix/p/5374810.html
代码:
public class Count {public int num;public void add(){for(int i =0;i < 10;i++){num++;}System.out.println(Thread.currentThread().getName()+"-" +num);}}
public class MyThreadTest {public static void main(String[] args){Count count = new Count();for(int i =0;i<10;i++){new Thread(new Runnable() {@Overridepublic void run() {try { /增加线程的并发性Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}count.add();}}).start();}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(count.num);} }
结果展示:
Thread-9-80 Thread-7-90 Thread-4-70 Thread-5-70 Thread-2-70 Thread-0-80 Thread-1-70 Thread-6-80 Thread-3-70 Thread-8-70 90
以上的代码原本应该等于100,但由于存在线程的问题,10个线程同时共享同一个变量,这样就容易产生线程安全问题。
原因:线程直接不能直接传递数据,他们之间的交互是通过共享数据来实现。如上述的代码中,10个线程共用一个count对象,这个count对象是在主内存中,每个线程都有自己的线程栈,都是从主存中读取count对象的值并复制过来,然后执行完add()方法后,再刷新到主存中,这样就很容易造成线程安全。
转载于:https://www.cnblogs.com/lfdingye/p/7355630.html
多个线程直接按对数据进行操作容易引发线程安全问题相关推荐
- Java高并发编程:线程范围内共享数据
笔记摘要 所谓线程范围内共享数据,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据,API中为我们提供了一个操作线程范围内共享数据的类Threa ...
- 并发工具类(四)线程间的交换数据 Exchanger
前言 JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ...
- 多线程学习(四)-线程范围内共享数据
一:线程范围内共享数据: 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这时候需要 ...
- python线程的注意点(线程之间执行是无序的、主线程会等待所有的子线程执行结束再结束(守护主线程)、线程之间共享全局变量、线程之间共享全局变量数据出现错误问题(线程等待(join)、互斥锁))
1. 线程的注意点介绍 线程之间执行是无序的 主线程会等待所有的子线程执行结束再结束 线程之间共享全局变量 线程之间共享全局变量数据出现错误问题 2. 线程之间执行是无序的 import thread ...
- 多线程面试题_线程,代码和数据–多线程Java程序实际运行的方式
多线程面试题 有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后您才意识到,这是我最想念的那几年,这是非常基本的. 了解多线程Java程序的执行方式就是其中之一. 您肯定已经 ...
- 多个线程访问共享对象和数据的方式
1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以那么做. 2.如果每个线程执行的代码不同,这时候就需要用不同的Runn ...
- 线程间怎么交换数据_2 万字长文详解 10 大多线程面试题|原力计划
作者 | ZZZhonngger 责编 | 伍杏玲 出品 | CSDN博客 Volatile相关 1.请谈谈你对 volatile 的理解 答:volatile 是 Java 虚拟机提供的轻量级的同步 ...
- 【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )
文章目录 一. Java 虚拟机内存模型 二. 程序计数器 ( 线程私有区 ) 三. 虚拟机栈 ( 线程私有区 ) 四. 本地方法栈 ( 线程私有区 ) 五. 方法区 ( 共享数据区 ) 1. 方法区 ...
- java 访问线程_java线程简介(共享对数据的访问)
1. 共享变量 要使多个线程在一个程序中有用,它们必须有某种方法可以互相通信或共享它们的结果. 让线程共享其结果的最简单方法是使用共享变量.它们还应该使用同步来确保值从一个线程正确传播到另一个线程,以 ...
最新文章
- java gson使用_Java 中 Gson的使用
- 关于架构的一点思考(一)
- shell编程--基本格式,基本语法,运算符,expr,(()),$[]
- MYSQL读书笔记---运算符、字符串操作
- 德国布线牛到不行?今天带你看看咱们中国的!
- 前端学习(2601):什么是跨域请求
- python是一种面相什么语言_Python面相对象编程的知识总结
- 某工程车零部件制造厂商
- 数据--第20课-递归的应用实战二
- 利用SusuCMS快速创建网站(一)
- 在数据库中如果组合主键(假设为stuID和stuName)存在则更新,不存在则新增
- python判断整数是否对称_刷题系列 - Python判断是否镜像对称二叉树
- 编程实现DBSCAN密度聚类算法,并以西瓜数据集4.0为例进行聚类效果分析
- 数据中心容灾备份规划设计
- 腾讯位置服务模仿微信发送位置功能
- 小王利用计算机设计了一个计算程序,小王利用计算机设计了一个计算程序,输入和输出的数据如下表:那么,当输入数据是8时,输出的数据是[]A.B.C.D.-七年级数学...
- js里分割字符串,数组拼接
- 装逼技巧:程序员如何用代码证明自己牛逼!
- web前端-html-css-字体的分类(serif衬线、sans-serif非衬线、monospace等宽、cursive草书、fantasy虚幻)
- java executor 源码_Java线程池ThreadPoolExecutor深度探索及源码解析