线程安全

什么是线程安全

线程安全是多线程领域的问题,线程安全可以简单理解为一个方法或者一个实例可以在多线程环境中使用而不会出现问题。
线程安全通常的做法是多线程访问时,采用加锁机制,当一个线程访问该类的某个资源时,进行保护,其它线程不能进行访问直到该线程读取完,其它线程才可使用。
线程安全不会出现数据不一致或者数据污染。

造成线程不安全的原因

线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。

如何判断资源是否是线程安全的

资源可以是:

  • 对象
  • 数组
  • 文件
  • 数据库连接
  • 套接字
  • ……

如果一个资源的创建、使用、销毁都在同一个线程内完成,且永远不会脱离该线程的控制,则该资源的使用就是线程安全的。

如何确保线程安全

  • 使用Synchronization关键字
  • 使用java.util.concurrent.atomic 包中的原子类,例如 AtomicInteger
  • 使用java.util.concurrent.locks 包中的锁
  • 使用ConcurrentHashMap、Vector、Stack、Hashtable、StringBuffer
  • 使用volatile关键字,保证变量可见性(直接从内存读,而不是从线程cache读)
  • 局部变量
    存储在线程自己的栈中。
    也就是说,局部变量永远也不会被多个线程共享。
    所以,基础类型的局部变量是线程安全的。

Java中非线程安全的资源

  • 引用
    即使一个对象是线程安全的不可变对象,指向这个对象的引用也可能不是线程安全的。
  • ArrayList、LinkerdList、HashMap、HashSet、TreeMap、TreeSet、StringBuilder。
坚持原创技术分享,您的支持将鼓励我继续创作!