允许被多个线程同时执行的代码称作线程安全的代码。线程安全的代码不包含竞态条件。当多个线程同时更新共享资源时会引发竞态条件。因此,了解 Java 线程执行时共享了什么资源很重要

一、局部变量(函数内定义)

局部变量存储在线程自己的栈中。也就是说,局部变量永远也不会被多个线程共享。

1、基础类型的局部变量

线程安全

2、局部的对象引用

对象的局部引用和基础类型的局部变量不太一样。尽管引用本身没有被共享,但引用所指的对象并没有存储在线程的栈内。所有的对象都存在共享堆中;

如果在某个方法中创建的对象不会逃逸出(即该对象不会被其它方法获得,也不会被非局部变量引用到)该方法,那么它就是线程安全的。

二、对象成员

对象成员存储在上。如果两个线程同时更新同一个对象的同一个成员,那这个代码就不是线程安全的。

三、确保线程安全

1、创建不可变的共享对象来保证对象在线程间共享时不会被修改,从而实现线程安全;

2、一个对象是线程安全的不可变对象,指向这个对象的引用也可能不是线程安全的,即引用不是线程安全的,通过同步可以解决;

最新文章

  1. js-权威指南学习笔记2
  2. Javascript中构造函数与new命令
  3. 【MySQL】 empty table and delete table.
  4. css之z-index
  5. jboss:在standalone.xml中设置系统属性(system-properties)
  6. linux基础-第十六单元 yum管理RPM包
  7. Core Animation一些Demo总结 (动态切换图片、大转盘、图片折叠、进度条等动画效果)
  8. GPU优化方法[转]
  9. MySQL sql_slave_skip_counter
  10. windows安装PHP5.4.8+Apache2.4.3+Mysql5.5.28
  11. HW3.13
  12. Linux命令备忘录
  13. 使用superMap实现点标注和区域着色
  14. iOS APP内购
  15. Maven项目中获取classpath和资源文件的路径
  16. 公式编辑器MathType基本使用方法总结----应付本科毕业论文完全没问题啦^_^
  17. css 字体、文本、padding的样式
  18. java7 NIO2 watching service API
  19. hibernate的flush()、refresh()、clear()针对一级缓存的操作的区别
  20. p2p登录拦截

热门文章

  1. HTML <section> 标签
  2. HDU_1022_Train Problem I
  3. ThinkPHP---thinkphp模型(M)拓展
  4. 04Servlet的生命周期
  5. react native 从头开始
  6. vue+webpack+npm搭建的纯前端项目
  7. Spring Boot 与ElasticSearch
  8. 【eclipse】外部 jar 包导入教程
  9. 用python写了一个猜年龄小游戏
  10. PAT 1125 Chain the Ropes