线程安全

作者: 微尘_8957 | 来源:发表于2018-09-25 13:08 被阅读7次

一、几个重要的概念

1.原子性:提供互斥访问,同一时间只能有一个线程来对他进行操作

2.可见性:一个线程对主内存的修改可以及时被其他线程观察到

3.有序性:一个线程观察其他宣称中的指令执行顺序,由于指令重新排序的存在,该观察结果一般杂乱无序

二、volatile和synchronized的区别与联系

1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住;

2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的;

3.volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性;

4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞;

5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。

三、volatile:

对volatile变量进行写操作时候,会在操作后加入一条store屏障指令,将本地内存中的共享变量值刷新到主内存。

对volatile变量进行读操作时候,会在操作前加入一条store屏障指令,从主内存中读取共享变量。

四、有序性  happens-before 原则 

java  内存模型中,允许编译器和处理器对指令进行重新排序,重排序不会影响单线程的执行却会影响多线程并发执行的正确性

volatile   synchronized  lock

happens-before 原则 

程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作

volatile变量规则:对一个变量的写操作先发生于后面对这个变量的读操作

传递规则:a-b-c  执行具有传递性

线程启动规则: Thread对象的start()方法现行发生于次线程的每一个动作。

线程中断规则: 对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生。

线程终结规则:线程中的所有操作都先于线程的终止操纵,我们可以通过Thread.jion()方法结束,Thread.isAlive()的返回值手段检测线程已经终止执行。

对象终结规则:一个对象的初始化完成现行发生于他的finalize()方法的开始。

五、安全发布对象

1.发布对象:使一个对象能够被当前范围之外的代码使用

(1)在静态初始化函数中初始化一个对象的引用

(2)讲对象的引用保存到volatile类型域或者AtomicReference对象中

(3)将对象的引用保存到某个正确构造对象的final类型域中

(4)将对象的引用保存到一个由锁保护的域中

双重检测锁且限制指令重排

2.对象逸出:一种错误的发布。当一个对象还没构造完成时候,就使用它被其他线程所见。

六、不可变对象

1.对象创建以后其状态就不能修改(final 修饰类,方法,变量)

Collections.unmodifableMap(clz)  对象不可修改

2.对象所有域都是final 类型

3.对象是正确创建(对象创建期间,this引用没有逸出)

相关文章

  • atomic & nonatomic

    什么是线程安全??? 线程安全:多线程操作共享数据不会出现想不到的结果就是线程安全的,否则,是线程不安全的。 at...

  • ConcurrentHashMap源码设计分析

    二、线程安全(Thread-safe)的集合对象:● Vector 线程安全● HashTable 线程安全● S...

  • HashMap 和 Hashtable 的区别

    线程安全: HashMap 是非线程安全的,而 Hashtable 是线程安全的,因为 Hashtable 内部的...

  • Java 的 StringBuffer 和 StringBuil

    区别就是:线程安全,StringBuffer 是线程安全的,StringBuilder 不是线程安全的。 他俩的实...

  • Java单例模式,线程安全

    懒汉式:线程安全,开销大 双重检查锁:线程安全,根据需求使用 静态内部类锁:线程安全,比较推荐 饿汗式:线程安全,...

  • 2018-06-12 第三十七天

    一、线程安全 线程安全的问题,是针对多线程的程序。单线程的情况下,是不存在线程安全问题。 产生线程安全问题的原因:...

  • 线程安全知多少

    1. 如何定义线程安全 线程安全,拆开来看: 线程:指多线程的应用场景下。 安全:指数据安全。 多线程就不用过多介...

  • JAVA 线程安全

    线程安全定义 一个类在可以被多个线程安全调用时就是线程安全的。 线程安全分类 线程安全不是一个非真即假的命题,可以...

  • synchronized锁

    一、线程安全的概念与synchronized 1、线程安全概念 并发程序开发的一大关注重点就是线程安全,线程安全就...

  • 线程安全的NSMutableDictionary

    NSDictionary是线程安全的,NSMutableDictionary是线程不安全的。利用锁来保证线程的安全...

网友评论

    本文标题:线程安全

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