`
烏魯奇奧拉
  • 浏览: 13107 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

什么叫线程安全、线程不安全?

    博客分类:
  • java
阅读更多
什么是线程安全?  如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
  或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
  线程安全问题都是由全局变量及静态变量引起的。
  若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。       线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据补充回答: 比如说,两个线程操作同一个ArrayList变量,那么一个线程这一时刻读的数据可能在下一刻要改变。

一般在类似于下面的情景下考虑线程安全的问题:

ArrayList products=new ArrayList ();
products用来存放生产出来的产品。
现在假设:有3个消费者线程,2个生产者线程。
每个生产者线程生产出一个产品,执行
products.add(new Product());
每个消费者线程消费一个产品执行
if(products.size()>=1){ products.remove(0);}

如果products里现在只有一个产品可以消费,但是有2个消费者线程请求消费,那么就有可能出现一个产品被同时消费的问题,而这是和实际不符的。

但是不同的线程访问Vector的时候不会发生这种错误,因为java会有相应的机制是同一时刻只有一个线程对这个变量操作 。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics