创建多线程的几种方式,线程死锁如何产生,如何防止线程死锁现象

方式:
  继承Thread重新run方法 实现Runnable接口 实现Callable 接口
扩充:
  Callable 和 Runnable 区别:
  runnable 没有返回值,callable可以拿到返回值。
  callable 可以看做是runnable 的补充

产生:
  一个资源只能被一个进程使用
  一个进行因多次请求造成阻塞,依然对已访问的资源保持不放
  进程已经获取到资源的使用权,但是一直未使用
  同一个进程,频繁的获取资源的使用权,一直未释放
防止:
  加锁顺序(线程按照一定的顺序加锁)
  加锁时间(线程尝试获取锁的时候,加上一定的时间,超过时间限制,则放弃对资源的锁)
  死锁检测(一般是吧所有的锁,都放在map中,检测map中的锁)
扩充:
  线程和进程的区别:
    一个程序至少有一个进程,一个进程至少有一个线程;一个进程也可以有多个线程,来增加程序的执行速度。
  守护线程是什么:
    守护线程就是后台的一种特例进程,它独立于控制终端,并且周期性的执行某种任务,或者等待处理某些事情发生的事件,在java种
  垃圾回收就是一种特殊的守护线程。
线程有哪些状态:
  new 尚未启动
  Runnable 正在执行
  blooked 阻塞的,(被同步锁,或者io锁阻塞)
  waiting 永久等待状态
  time_waiting 等待指定时间,重新被唤醒的状态
  terminated (吹美内特) 执行完成
sleep 和 wait 的区别:
  类的不同:sleep 来自Thread wait 来自Object
  释放锁: sleep不需要释放锁,wait需要手动释放
  用法不同: sleep 时间到了之后自动唤醒, wait 可以使用 notify() notifyAll()直接唤醒。
notify 和 notifyAll 区别
  notifyAll 唤醒所有的等待线程,notify唤醒一个
  notifyAll 调用后,将全部等待的线程由等待池,移动到锁池,然后参与锁的竞争,竞争成功者则继续执行,如果未成功则继续留在锁池,等待锁释放之后继续竞争。
  notify 唤醒一个,具体是哪一个,这个由虚拟机控制。

猜你喜欢

转载自www.cnblogs.com/hacker-lsr/p/11787223.html