美文网首页程序员
可见性,原子性,不变性

可见性,原子性,不变性

作者: Cafebaby | 来源:发表于2016-03-15 11:16 被阅读180次

可见性

当一个线程修改了对象状态后,其他线程能够看到发生的状态变化

如何保证?

  • 加锁,当线程B执行由锁保护的同步代码块时,可以看到线程A在同一个同步代码块中的所有操作结果。(这也是为什么要求访问某个共享且可变的变量时要求所有线程在同一个锁上同步)
  • vlolatile变量,确保将变量的更新操作通知到其他线程。(不会被重排序,不会被缓存)

原子性

操作不会被线程调度器打断

如何保证?

  • synchronized,同时保证了可见性与原子性

不变性

如果某个对象在构造后状态不再改变,那么这个对象就是不可变对象,一定是线程安全的
要求

  • 对象创建后状态不可更改
    对象所有域都是final类型(意义上的,而非一定都是final关键字标记)
  • 对象正确创建,创建期间this引用没有溢出

关于逸出的问题
例如构造方法中发布了一个内部类,由于内部类实例包含了对外部类实例的隐含引用,导致创建期间外部类实例的this逸出

如果安全的发布?

  • 静态初始化函数中初始化一个对象引用(public static MyObj obj=new MyObj())
  • 将对象引用保存在violatile类型或者AtomicReference对象中
  • 将对象引用保存在某个正确构造对象的final域中
  • 将对象引用保存在由锁保护的域中,如线程安全容器vector,hashtable

相关文章

  • 可见性,原子性,不变性

    可见性 当一个线程修改了对象状态后,其他线程能够看到发生的状态变化 如何保证? 加锁,当线程B执行由锁保护的同步代...

  • 【java并发编程实战】第二章笔记:对象的共享

    1.重要的属性 可见性,不变性,原子性 1.1可见性 当一个线程修改某个对象状态的时候,我们希望其他线程也能看到发...

  • 阿里面试题(题目来源网络)

    如何保证线程安全?从那几个角度入手。 原子性可见性不变性 synchronized与lock的区别,使用场景。sy...

  • [笔记]Java中的锁相关知识

    原子性、可见性、有序性 原子性:一段指令不会被拆分给多个处理器执行synchronized能实现原子性可见性:数据...

  • Java多线程

    01 |可见性、原子性和有序性问题:并发编程Bug的源头 原子性:线程切换导致原子性。 可见性:CPU缓存导致可见...

  • java基础18-并发学习

    1.并发问题:可见性,原子性和有序性 cpu缓存会导致可见性,线程切换会导致原子性(count++不是原子的),编...

  • Sychronized & Volatile

    Synchronized 保证了可见性 ,并且保证了原子性Volatile只保证了可见性,不能保证原子性,即只能保...

  • 深入理解synchronized底层原理,一篇文章就够了!

    前言 一、synchronized的特性1.1 原子性1.2 可见性1.3 有序性1.4 可重入性 二、synch...

  • synchronized

    Klass Monitor 对象头 锁优化 jstack javap 特性 三大特性:可见性、原子性、有序性 可重...

  • 10-同步机制的其它作用

    同步机制的其它作用:原子性、可见性和有序性 synchronized和Lock不仅可以确保原子性、可见性还可以确保...

网友评论

    本文标题:可见性,原子性,不变性

    本文链接:https://www.haomeiwen.com/subject/eitqlttx.html