首页 > 代码库 > 线程安全总结

线程安全总结

一:什么是线程安全

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

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

二:线程安全的重要性

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

:如何做到线程安全

 四种方式   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.买火车票时,可能出现多个人买到同一个座位的情况。

 

线程安全总结