一、Java并发编程基础概念

一、进程与线程

进程:
  进程是操做系统结构的基础,是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
线程:
  线程能够理解为是进程中独立运行的子任务数据库

进程与线程的联系与区别:安全

  • 一个程序的运行至少包含一个进程,一个进程至少有一个线程
  • 线程的划分尺度要小于进程,使得多线程的并发性高
  • 进程在执行过程当中拥有独立的内存单元,而多个线程共享内存,从而极大的提升了程序的运行效率

二、线程安全

  线程安全就是多个线程访问同一个类,无论运行时环境采用何种调度方式或者这些线程如何交替运行,而且在主调代码中不须要任何额外的同步或协同,这个类都能表现出正确的行为,那么就程这个类是线程安全的。多线程

三、同步和异步

同步和异步是针对方法调用而言的
同步是指方法调用会等待方法返回,方法返回后才能继续往下执行。
异步是指方法调用会当即返回,并继续向下执行,可是异步调用当即返回并不表示这个调用请求处理完成,而是会在后台起一个线程去执行。并发

四、并行与并发

并发:多个线程抢占同一CPU时间片
并行:不一样的CPU同时执行不一样的线程异步

五、临界区

临界区用来表示一种公共资源。能够被多线程使用,可是一次只能一个线程使用它,一旦临界区被占用,其余线程要想使用临界区资源,则只能进入阻塞等待队列。操作系统

六、阻塞与非阻塞

阻塞和非阻塞一般用来形容多线程间的相互影响。
若是一个线程占用了临界区资源,那么其余全部须要这个资源的线程就会在这个临界区的阻塞队列中等待,等待就会致使线程挂起,致使阻塞。若是占用这个临界区资源的线程一直不释放资源,那么全部阻塞在这个临界区的线程都不能进行工做。
而非阻塞是多个线程同时进入临界区。线程

七、死锁

死锁是指两个或者多个线程相互持有对方须要的资源,致使这些线程处于等待状态,没法继续前行
死锁产生的必要条件:队列

  • 互持条件:一个资源只能被一个进程占用
  • 请求和保持条件:一个进程因请求被占用的资源发生阻塞时,对已得到资源保持不放
  • 不剥夺条件:任何一个资源在没被该进程释放以前,任何其余线程都没法对他剥夺占用
  • 循环等待条件:当发生死锁时,所等待的资源必然会造成一个环路。形成永久阻塞。

避免死锁的几个方式:进程

  1. 避免一个线程同时获取多个锁
  2. 避免一个锁内同时占用多个资源,尽可能保证每个锁只占用一个资源
  3. 尝试使用定时锁,lock.tryLock(timeout)来替代使用内部锁机制
  4. 对于数据库锁,加索和解锁必须在一个数据库连接里,不然会致使解锁失败
八、饥饿

某些线程于其余线程抢占CPU时间片时,老是没有抢占到CPU时间片,就会使线程处于饥饿状态内存

九、活锁

与死锁相反,活锁是过分的释放CPU资源,都不去抢占资源,致使线程阻塞

相关文章
相关标签/搜索