什么是线程安全

https://blog.csdn.net/suifeng3051/article/details/52164267java

我的总结:web

  • 线程安全:原子性、可见性、有序性
  • 线程安全能够简单理解为
    • 一个方法或者一个实例能够在多线程环境中使用而不会出现问题
  • 多个线程访问了相同的资源
    • 同一内存区(变量,数组,或对象)、系统(数据库,web services等)或文件等
  • 只有在一或多个线程向这些资源作了写操做时才有可能发生,
    • 只要资源没有发生变化,多个线程读取相同的资源就是安全的
  • 咱们没法知道操做系统什么时候会在两个线程之间切换
    • 有序性会被打破
  • 基础类型的局部变量是线程安全的

    • 定义在方法内部的局部变量
    • 局部的对象引用就不必定,由于对象存在堆里面,能够存在多个引用

  • 判断资源对象是不是线程安全

    • 好比:多线程各自建立数据库链接,在链接层面是线程安全的
    • 可是操做的是数据库相同的数据,在数据库层面就不是线程安全的
  • 即便一个对象是线程安全的不可变对象,指向这个对象的引用也可能不是线程安全的
    • 好比ConcurrentHashMap 是线程安全的,可是使用它 get,再set 也不是线程安全的

Java中实现线程安全的方法数据库

  • 在Java多线程编程当中,提供了多种实现Java线程安全的方式:
    • 最简单的方式,使用Synchronization关键字:Java Synchronization介绍
    • 使用java.util.concurrent.atomic 包中的原子类,例如 AtomicInteger
    • 使用java.util.concurrent.locks 包中的锁
    • 使用线程安全的集合ConcurrentHashMap
    • 使用volatile关键字,保证变量可见性(直接从内存读,而不是从线程cache读)  
相关文章
相关标签/搜索