分享

1、Java并发编程基础概念

 行者花雕 2020-03-04
1、进程与线程

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

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

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

2、线程安全

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

3、同步和异步

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

4、并行与并发

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

5、临界区

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

6、阻塞与非阻塞

阻塞和非阻塞通常用来形容多线程间的相互影响。
如果一个线程占用了临界区资源,那么其他所有需要这个资源的线程就会在这个临界区的阻塞队列中等待,等待就会导致线程挂起,导致阻塞。如果占用这个临界区资源的线程一直不释放资源,那么所有阻塞在这个临界区的线程都不能进行工作。
而非阻塞是多个线程同时进入临界区。

7、死锁

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

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

避免死锁的几个方式:

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

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

9、活锁

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多