JAVA线程

Object的notify和notifyAll方法的区别

  • notify:只会唤醒等待该锁的其中一个线程
  • notifyAll:唤醒等待锁的所有线程

每个对象都拥有两个池,锁池和等待池

  • 锁池:假设线程A已经拥有了某个对象的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。
  • 等待池:假设一个线程A获取到锁之后,由于条件不满足,此时需要调用锁的wait()方法,那么线程放弃这把锁,并进入这把锁的等待池。等待池中的线程不可获取锁,需要被唤醒进入锁池,才能获得锁的可能。

如果其他线程调用了notify方法,则会根据一定的算法从等待池中选取一个线程进入锁池

如果其他线程调用了notifyAll方法,则会将等待池中的所有线程放到锁池,并争抢锁。

线程中sleep和wait的区别

  • wait是Object中的方法,而sleep是Thread中的方法
  • wait会释放锁,sleep不会释放锁。sleep是线程被调用时,占着CPU去睡眠,其他线程不能占用CPU。wait是进入等待池等待让出CPU.
  • wait只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用,且不需要被唤醒
  • sleep必须捕获异常,wait不需要捕获异常

你可能感兴趣的:(JAVA线程)