JAVA多线程(一)

来源:互联网 发布:唐斯2016赛季数据 编辑:程序博客网 时间:2024/05/23 18:15

一、线程与进程的区别

  线程:线程是指在程序运行过程中,能够执行程序代码的执行单元。状态分为四种:运行、就绪、挂起和结束。

  进程:进程是指一个正在执行的程序。

  

  关系:线程是程序执行的最小单元,一个进行能够拥有多个线程,多个线程之间可以共享程序内存空间(代码段、数据段和对空间)

  及一些进程级资源,但是各个线程拥有自己的栈空间。

  进程与线程关系图:

  

 

  多线程优点:

  1.使用多线程可以减少程序响应时间,在使用单线程时,通常会陷入长时间的等待,此时就不会响应其他操作(如鼠标、键盘),但使用多线程就可以单独分配一个线程去执行该程序。

  2.与进程相比,线程的创建与切换开销更小。由于启动新的线程必然会为这个新的线程分配地址空间,建立许多的数据结构来维护代码段、数据段等信息,而运行在同一个进程中就可以共享这些数据段        和代码段。比进程开销要小得多,多线程在数据共享方面效率非常高。

  3.多CPU或多核计算机本身具备执行多线程能力,不适用会造成巨大浪费。

  4.代码结构简化易于维护。

 

二、同步与异步区别

  
  背景: 经常会遇到数据共享问题,就是当多个线程访问同一个资源时,它们需要以某种顺序来确保该资源在某一时刻只能被一个线程使用,在这种情况下就需要对数据进行同步。

  

  同步:

  如何实现同步操作?

  要想实现同步操作,就必须要获得每个线程的对象锁。获得它可以保证同一时刻只有一个线程能够进入临界区(访问互斥资源代码块),并且在这个锁被释放之前,其他线程不能进入临界区。

  如果还有其他线程想要获得该对象的锁,只能进入等待队列等待。只有当拥有该对象锁的线程退出临界区时,锁才会被释放,等待队列中优先级高的线程才能获得该所,从而进入共享代码区。

  Java语言提供了语言级支持,可以通过synchronized关键字来实现同步,但该方法会以很大的系统开销作为代价,又是可能会出现死锁,所以同步控制并非越多越好,尽量避免无谓的同步控制。实现同步的方式有两种:一种利   用同步代码块实现,一种利用同步方法来实现。

  异步:

  异步与非阻塞类似,由于每个线程都包含运行自身所需要的数据与方法,处理输入输出处理时,不必关心其他线程的状态,避免让程序等待,这时候就可以使用异步了。

 

  栗子:

  再举个栗子,i西科用户在获取课表时,如果该用户第一次使用i西科,i西科服务器在返回给用户课表的同时,又想要把用户课表存储下来以便于后期在第三方授权平台网站无法连接情况下能够从i西科数据库获取用户课表,那么这时就需要异步去处理,因为为了提高响应速度,就不能先存储用户课表,然后再将数据返回给用户。异步的有势就体现出来了。解决方案:方法一:可以使用多线程去实现,开两个线程,一个线程返回给用户数据,一个线程去存储数据库,方法二:利用SpringMVC 拦截器提供的三层(preHandle、postHandle、aftercompalation)。

  

原创粉丝点击