参考链接: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

多个线程直接按对数据进行操作容易引发线程安全问题相关推荐

  1. Java高并发编程:线程范围内共享数据

    笔记摘要 所谓线程范围内共享数据,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据,API中为我们提供了一个操作线程范围内共享数据的类Threa ...

  2. 并发工具类(四)线程间的交换数据 Exchanger

    前言   JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ...

  3. 多线程学习(四)-线程范围内共享数据

    一:线程范围内共享数据: 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这时候需要 ...

  4. python线程的注意点(线程之间执行是无序的、主线程会等待所有的子线程执行结束再结束(守护主线程)、线程之间共享全局变量、线程之间共享全局变量数据出现错误问题(线程等待(join)、互斥锁))

    1. 线程的注意点介绍 线程之间执行是无序的 主线程会等待所有的子线程执行结束再结束 线程之间共享全局变量 线程之间共享全局变量数据出现错误问题 2. 线程之间执行是无序的 import thread ...

  5. 多线程面试题_线程,代码和数据–多线程Java程序实际运行的方式

    多线程面试题 有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后您才意识到,这是我最想念的那几年,这是非常基本的. 了解多线程Java程序的执行方式就是其中之一. 您肯定已经 ...

  6. 多个线程访问共享对象和数据的方式

    1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以那么做. 2.如果每个线程执行的代码不同,这时候就需要用不同的Runn ...

  7. 线程间怎么交换数据_2 万字长文详解 10 大多线程面试题|原力计划

    作者 | ZZZhonngger 责编 | 伍杏玲 出品 | CSDN博客 Volatile相关 1.请谈谈你对 volatile 的理解 答:volatile 是 Java 虚拟机提供的轻量级的同步 ...

  8. 【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )

    文章目录 一. Java 虚拟机内存模型 二. 程序计数器 ( 线程私有区 ) 三. 虚拟机栈 ( 线程私有区 ) 四. 本地方法栈 ( 线程私有区 ) 五. 方法区 ( 共享数据区 ) 1. 方法区 ...

  9. java 访问线程_java线程简介(共享对数据的访问)

    1. 共享变量 要使多个线程在一个程序中有用,它们必须有某种方法可以互相通信或共享它们的结果. 让线程共享其结果的最简单方法是使用共享变量.它们还应该使用同步来确保值从一个线程正确传播到另一个线程,以 ...

最新文章

  1. java gson使用_Java 中 Gson的使用
  2. 关于架构的一点思考(一)
  3. shell编程--基本格式,基本语法,运算符,expr,(()),$[]
  4. MYSQL读书笔记---运算符、字符串操作
  5. 德国布线牛到不行?今天带你看看咱们中国的!
  6. 前端学习(2601):什么是跨域请求
  7. python是一种面相什么语言_Python面相对象编程的知识总结
  8. 某工程车零部件制造厂商
  9. 数据--第20课-递归的应用实战二
  10. 利用SusuCMS快速创建网站(一)
  11. 在数据库中如果组合主键(假设为stuID和stuName)存在则更新,不存在则新增
  12. python判断整数是否对称_刷题系列 - Python判断是否镜像对称二叉树
  13. 编程实现DBSCAN密度聚类算法,并以西瓜数据集4.0为例进行聚类效果分析
  14. 数据中心容灾备份规划设计
  15. 腾讯位置服务模仿微信发送位置功能
  16. 小王利用计算机设计了一个计算程序,小王利用计算机设计了一个计算程序,输入和输出的数据如下表:那么,当输入数据是8时,输出的数据是[]A.B.C.D.-七年级数学...
  17. js里分割字符串,数组拼接
  18. 装逼技巧:程序员如何用代码证明自己牛逼!
  19. web前端-html-css-字体的分类(serif衬线、sans-serif非衬线、monospace等宽、cursive草书、fantasy虚幻)
  20. java executor 源码_Java线程池ThreadPoolExecutor深度探索及源码解析

热门文章

  1. MyBatisPlus中自定义全局操作流程
  2. Tkinter的Canvas组件
  3. SpringBoot使用thymeleaf
  4. Dart 异步编程之 Isolate 和事件循环
  5. oracle socket读取超时,设置套接字操作超时
  6. 20+ 家标杆车企实践总结,数字化转型的秘诀都在这儿
  7. 直播回顾 | 数据驱动实践的三大运营场景讲解
  8. 神策 FM |「聚焦」细分市场是独角兽诞生的营销关键
  9. 使用字符代替圆角尖角研究(转)
  10. 7-27 兔子繁衍问题(15 分)