本文作者:sukai

并发编程pdf(并发编程的三要素)

sukai 02-10 125

Java并发编程的目的

  由于硅晶体管的运行速度和性能难有突破性发展,从而导致CPU的主频也逐渐接近性能极限,故多核CPU的使用便成为必然的趋势。在实际运用中,如果CPU在任何时间内只能处理一段业务逻辑而不是让多段业务逻辑同时工作,从而导致CPU的浪费且CPU也不能真正发挥出多核的优势来,更不能达到充分利用CPU的目的。面对复杂的互联网业务模型,显然并行程序比串行程序更能发挥多核CPU的优势,更能防止线程阻塞导致程序停止,从而达到提高程序运行效率,处理更多复杂的业务逻辑以适合更多的业务需求。除此之外,并行处理可以将程序中大的任务分解成多个小任务,从而建立程序模型分别运行。

  2.同步(Synchronous)和异步(Asynchronous)

  同步和异步是针对方法调用而言的,同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;异步更像消息传递,是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态,整个过程不会阻碍调用者的工作。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。同步问题多发生在多线程环境中的数据共享问题。即当多个线程需要访问同一个资源时,它们需要以某种顺序来确保该资源在某一特定时刻只能被一个线程所访问,如果使用异步,程序的运行结果将不可预料。因此,在这种情况下,就必须对数据进行同步,即限制只能有一个进程访问资源,其他线程必须等待。实现同步的机制主要有临界区、互斥、信号量和事件。

  3.并发(Concurrency)和并行(Parallelism)

  并发和并行都可以表示两个或者多个任务一起执行,但是并发偏重于多个任务交替执行且多个任务有可能是串行执行的,并行的多个任务是同时执行的。换言之并发是同时处理很多事情,并行是同时执行很多事情。因为单核CPU每次只能执行一条指令,就算使用多进程或者多线程任务也不能算是真正意义上的并行,所以实际上真实的并行只可能出现在多核CPU中。

并发编程pdf(并发编程的三要素)

  4.临界区

  临界区用来表示一种可以被多个线程使用的公共资源(共享数据)。通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资 源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。

  5.阻塞(Blocking)和非阻塞(Non-Blocking)

  阻塞和非阻塞通常用来描述多线程间的相互影响。如果当前线程占用了临界区资源,那么其他所有需要资源的线程必须在这个临界区中等待,从而导致线程挂起而产生阻塞,直到占用资源的线程释放资源才能继续工作。非阻塞是指线程之间的运作互不影响,所有的线程都会尝试不断前向执行。阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。非阻塞调用是指函数虽然不能立刻得到结果,但是该函数不会阻塞当前线程,而会立刻返回。

  6.死锁(Deadlock),饥饿(Starvation)和活锁(Livelock)

  死锁,饥饿和活锁都属于多线程的活跃性问题,如果相关线程不再活跃,那么线程很难继续执行下去。哲学家吃饭问题是典型的死锁,多线程互相拥有对方的锁资源不释放,导致多线程都等待锁资源的释放从而产生死锁。优先级高的线程总能比优先级低的线程更容易抢占到它所需要的资源,这时优先级低的线程无法继续工作从而产生饥饿。如果某个线程一直占用关键资源不释放,也会导致其他需要这个资源的线程无法正常执行从而产生饥饿。活锁就是两个线程主动将资源释放给其他线程使用,这样做的结果就是出现资源不断在两个线程间跳动而没有一个线程可以同时拿到所有资源而正常执行,这也是我们平时所说的互相谦让。

  7.并发的级别

  8.Amdahl和Gustafson定律

  9.Java内存模型JMM

  10.指令重排序处理

阅读
分享