zoukankan      html  css  js  c++  java
  • 线程安全总结

    一:什么是线程安全

      线程安全 就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全 就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

      如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

    二:线程安全的重要性

      防止脏数据或者数据污染。

    :如何做到线程安全

     四种方式   sychronized关键字

       1. sychronized method(){}

       2. sychronized (objectReference) {/*block*/}

       3. static synchronized method(){}

       4. sychronized(classname.class)

      其中1和2是代表锁当前对象,即一个对象就一个锁,3和4代表锁这个类,即这个类的锁。

      要注意的是sychronized method()不是锁这个函数,而是锁对象,即:如果这个类中有两个方法都是sychronized,那么只要有两个线程共享一个该类的reference,每个调用这两个方法之一,不管是否同一个方法,都会用这个对象锁进行同步。
      注意:long 和double是简单类型中两个特殊的咚咚:java读他们要读两次,所以需要同步。

    四:哪些类是线程安全的

      在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的。在jdk1.2之后,就出现许许多多非线程安全的类。 下面是这些线程安全的同步的类:

      vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。

      statck:堆栈类,先进后出

      hashtable:就比hashmap多了个线程安全

      enumeration:枚举,相当于迭代器

        StringBuffer:StringBuilder是线程不安全的

      

    五:什么时候考虑使用线程安全的类

      非线程安全是指多线程操作同一个对象可能会出现问题。而线程安全则是多线程操作同一个对象不会有问题。

      线程安全必须要使用很多synchronized关键字来同步控制,所以必然会导致性能的降低

      所以在使用的时候,如果是多个线程操作同一个对象,那么使用线程安全的类;否则,就使用效率更高的非线程安全类。

      非线程安全!=不安全

      有人在使用过程中有一个不正确的观点:我的程序是多线程的,不能使用ArrayList要使用Vector,这样才安全。

      非线程安全并不是多线程环境下就不能使用。注意我上面有说到:多线程操作同一个对象。注意是同一个对象

      如果是每个线程中new一个ArrayList,而这个ArrayList只在这一个线程中使用,那么肯定是没问题的。

    六:应用场景

      1.下订单时,如果某件商品只有最后一件了,而这时有多个人同时买这件商品,如果不是线程安全的可能会出现多个人都够买成功的情况。

      2.买火车票时,可能出现多个人买到同一个座位的情况。

  • 相关阅读:
    echarts 实时获取数据
    js 对象与数组相互转化的快捷方法 Object.keys()、Object.values()、Object.entries()
    koa2 中使用 svg-captcha 生成验证码
    分享面试资料包
    8位单片机中一个容易被忽视的溢出问题
    献给半夜加班到深夜的女程序员
    java调用WebService接口方法
    算法小记:快速排序
    STL源码剖析 迭代器(iterator)概念与编程技法(三)
    [置顶] 蓝牙基础知识进阶——Physical channel
  • 原文地址:https://www.cnblogs.com/sosolili/p/6623216.html
Copyright © 2011-2022 走看看