关于面试官问的死锁和线程之间通信----问题总结

1.死锁问题产生?解决方法?

死锁,指的是多个线程在运行过程中因争夺资源而造成的一种僵局,当线程处于这种僵持状态时,若无外力作用,他们都将无法再向前推进。
举例:此时有一个线程A,按照先锁a再获得锁b的顺序获得锁,而在此时同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。

产生死锁的原因:
1. 竞争资源
产生死锁中的竞争资源之一指的是竞争不可剥夺资源和临时资源
2.进程间推进顺序非法
若P1保持了资源R1,P2保持了资源R2,系统处于不安全状态,因为这两个线程再向前推进,便可能发生死锁
例如,当P1运行到R2时,将因R2已被P2占用而阻塞,当P2运行到R1时,也将因R1已被P1占用而阻塞,于是发生进程死锁

死锁产生的4个必要条件:

  1. 互斥条件:进程要求对所分配的资源进行排他性控制,即在一段时间内某资源仅为一进程所占用。
  2. 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
  3. 不可剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
  4. 环路等待条件:在发生死锁时,必然存在一个进程—资源的环形莲。

预防死锁:

  1. 资源一次性分配:一次性分配所有资源,这样就不会再有请求了(破坏请求条件)
  2. 只要有一个资源得不到分配,也不给这个进程分配其他资源(破坏请保持条件)
  3. 可剥夺资源:即当某进程获得了部分资源,但得不到其他资源,则释放已占有的资源(破坏不可剥夺条件)
  4. 资源有序分配法:系统给每类资源赋予一个编号,每一个进程按照编号递增的顺序请求资源,释放则相反(破坏环路等待条件)

超时放弃。
当使用Synchronize关键词时,只要线程没有获得锁,那么就会永远等待下去。但是lock接口提供了boolean tryLock(long time,TimeUnit unit) throws InterruptedException方法。该方法可以按照固定时长等待锁,因此线程可以在获取锁超时之后,主动释放之前已经获得的所有的锁。

解除死锁:

  1. 剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态。
  2. 撤销进程:可以直接撤销死锁进程或撤销代价最小的进程,直至有足够的资源可用,死锁状态消除为止。所谓代价是指优先级,运行代价、进程的重要性和价值。

进程之间通信方式:

  1. 管道(PIPE)
  2. 命名管道(FIFO)
  3. 信号量
  4. 消息队列
  5. 共享内存
  6. Socket

线程之间通信方式:

使用object类的wait()和notify()方法。必须配合synchronized使用
Object类提供了线程间通信的方法:wait(),notify(),notifyAll(),它们是多线程通信的基础,

你可能感兴趣的:(面试必备(背))