第一章 并发简介

一、之所以在计算机中加入操作系统来实现多个程序的同时执行,主要是基于以下原因:

       1、资源利用率:可以同时运行多个程序。

       2、公平性:资源共享和同等的使用权。

       3、便利性:计算多个任务的时候,编写多个程序,每个程序执行一个任务并在必要的时候通讯,这笔只编写一个程序来计算所有的任务更容易实现。

二、线程带来的风险

       1、安全性问题:线程安全性可能是非常复杂的,在没有充足同步的情况下,多个线程中的操作执行顺序是不可预测的,甚至会产生奇怪的结果。

       例:

@NotTheadSafe
public class UnsafeSequence{

    private int value;

    public int getNext(){

       return value++;      

    }

}

   如果多个线程同时执行 getNext();那么可能返回相同的结果。

  修改成线程安全后如下:

@TheadSafe
public class Sequence{
  //该注释标识这个变量 受对象内部锁保护
  @GuardedBy("this")
  private int value;

  public synchronized int getNext(){

     return value++;
   
  }

}

     2、活跃性问题

           安全性的含义是“永远不会发生糟糕的事情”,而活跃性则关注于另一个目标,即“某件正确的事总会发生”。当某个操作无法继续执行下去的时候就会发生活跃性问题。

     例:如果线程A在等待线程B释放资源,而线程B永远不释放资源,那A就会永远等待下去。

     3、性能问题

     性能问题包括多个方面,例如服务时间过长,相应不灵敏,吞吐率过低,资源消耗过高,或者可伸缩性较低。

     在设计良好的并发应用程序中,线程能提升程序的性能,但无论如何,线程总会带来某种程度上的运行时开销。在多线程程序中,当线程调度器临时挂起活跃县城并转而运行另一个线程时,就会频繁的出现切换上下文操作,这种操作将带来极大的开销:保存和回复执行上下文,丢失局部性,并且CPU时间将更多的话费在线程调度而不是程序运行上。当县城共享数据室,必须使用同步机制,而这些机制往往会一直某些编译器优化,是内存缓存区中的数据无效,一级增加共享内存总线的同步流量。所有这些因素都将带来额外的性能开销。

  

猜你喜欢

转载自710173455.iteye.com/blog/2204101