一、可见性
什么是可见性?
Java线程安全须要防止某个线程正在使用对象状态而还有一个线程在同一时候改动该状态,并且须要确保当一个线程改动了对象的状态后,其它线程能够看到发生的状态变化。 后者就是可见性的描写叙述即多线程能够实时获取其它线程改动后的状态。
     *** 待补充   两个工人同一时候记录生产产品总数问题

1. 失效数据
可见性出现故障就是其它线程没有获取到改动后的状态,更直观的描写叙述就是其它线程获取到的数据是失效数据。

2. 非原子64位操作

3. 加锁与可见性
比如在一个变量的读取与+1上加入一把锁,锁保证了其它线程获取到此变量都是+1后的值,所以能够保证可见性。

4. Volatile变量
线程对共享变量的改动,对其它线程可见
满足下面条件,使用Volatitle:
对变量的写入操作不依赖变量的当前值,或者你能确保仅仅有单个线程更新变量的值。
该变量不会与其它状态变量一起纳入不变形条件中。
在訪问变量时不须要加锁。



二、公布 、逸出
公布一个对象的意思是指,使对象可以在当期作用域之外的代码中使用。
简单的能够理解为其它地方获取到当前类的对象,这样的情况就是公布当前类。
Java多线程不仅要确保当前类是线程安全的,并且须要保证使用当前类对象的全部地方都要保证线程安全性。


三、封装
线程封闭 - 把共享的数据,仅在线程中使用,不共享.比如java的ThreadLocal类
     Ad-hoc线程封闭 -- 维护线程封闭性的职责全然由程序实现承担.(非常脆弱)
     线程封闭 - 通常将特定子系统实现为一个单线程子系统
栈封闭
     线程封闭的特例, 比如基本类型的局部变量
ThreadLocal - 通常防止可变的单实例对象 或 全局变量进行共享.


四、不可变
final对象,本身不可改变,可是final中的变量却能够改变


五、安全公布方式:
1. 静态初始化函数中初始化一个对象引用
2. 将对象的引用保存到volatile类型的域或者AtomicReference对象中
3. 将对象的引用保存到某个正确的构造对象的final类型域中
4. 将对象的引用保存到一个由锁保护的域中




最新文章

  1. 修改NavigationView中的Item的Icon大小
  2. python 基础理解...
  3. SGU 174 Walls
  4. linux下安装svn(基于编码的方式)
  5. poj2778DNA Sequence (AC自动机+矩阵快速幂)
  6. HTML 5 drag and drop 简介
  7. 【ADO.Excel】ADO获取excel的Sheet集合
  8. Apache的安装
  9. 轻量级别的Cache和反向代理软件---Varnish
  10. Java进阶篇设计模式之十三 ---- 观察者模式和空对象模式
  11. 从零开始搭建运维体系 - ansible
  12. MySQL使用索引的场景分析、不能使用索引的场景分析
  13. mysql如何修改root用户的密码
  14. box-sizing border-box 的理解
  15. Python中返回SQL字段名
  16. App升级iOS7体会
  17. JQuery选择器中的一些注意事项
  18. Ubuntu 安装第一步,打开ssh
  19. TDD: 测试静态方法
  20. ActiveX控件在项目中的应用

热门文章

  1. Sikulix IDE简介
  2. [转]linux系统磁盘分区之parted
  3. linux笔记_20150825_linux有什么好处
  4. Python超级程序员使用的开发工具
  5. 二叉树单色路径最长&&穿珠子
  6. TopFreeTheme精选免费模板【20130619】
  7. 《Java数据结构与算法》笔记-CH5-链表-4用链表实现堆栈
  8. js运动 缓冲运动
  9. html5 canvas防微博旋转
  10. tomcat 粗略笔记