身为JAVA工作者必须了解的实战知识(二)

一、可见性

什么是可见性?

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. 将对象的引用保存到一个由锁保护的域中

java并发编程(二): 对象的共享

探索并发编程(三)------Java存储模型和共享对象

同步和Java内存模型 (三)可见性

一、同步容器类

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 43,002评论 11 349
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 35,112评论 18 399
  • 一、设计线程安全的类 在设计线程安全类的过程中,需要包含以下三个基本要素: . 找出构成对象状态的所有变量。 . ...
    a_decb阅读 406评论 0 0
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,954评论 0 11
  • 坐在北京的某个公园里午休。四月的天气还有些许凉爽。柳絮飘过,勾起了我对于往事的回首。 小时候,东北的春天不如京城来...
    冬青33阅读 253评论 0 0

友情链接更多精彩内容