java多线程

1、线程的五种状态

  新建状态、就绪状态、运行状态、阻塞状态、同步状态、死亡状态

  阻塞状态:同步阻塞、等待阻塞、其他阻塞

2、run()方法和start()方法的区别

  线程的run()方法是由java虚拟机直接调用的,如果我们没有启动线程(没有调用线程的start()方法)而是在应用代码中直接调用run()方法,那么这个线程的run()方法其实运行在当前线程(即run()方法的调用方所在的线程)之中,而不是运行在其自身的线程中。

  run()方法在线程内被调用和其他方法没有区别,可以重复执行

  start()方法启动一个线程,不可以重复执行

  start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。

  run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。

3、线程锁

  synchronized和Lock的区别

  1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类;

  2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;

  3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;

  4.用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;

  5.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)

  6.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。

4、死锁

  产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生。

 (1)互斥条件:一个资源每次只能被一个进程使用。独木桥每次只能通过一个人。

   (2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。乙不退出桥面,甲也不退出桥面。

   (3)不剥夺条件: 进程已获得的资源,在未使用完之前,不能强行剥夺。甲不能强制乙退出桥面,乙也不能强制甲退出桥面。

   (4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。如果乙不退出桥面,甲不能通过,甲不退出桥面,乙不能通过。

 

posted @ 2019-07-01 17:43  慕容小拽  阅读(53)  评论(0编辑  收藏  举报