java多线程

来源:互联网 发布:五五开德云色事件知乎 编辑:程序博客网 时间:2024/05/29 19:04
  • 线程变化状态图:
    sleep()、join()、yield()、start()、interrupt()对象主体是线程。
    这里写图片描述
  • 锁变化状态图:
    wai()、notify()、notifyAll()对象主体可以是任何Object。
    这里写图片描述

monitor

他们是应用于同步问题的人工线程调度工具。讲其本质,首先就要明确monitor的概念,Java中的每个对象都有一个监视器,来监测并发代码的重入。在非多线程编码时该监视器不发挥作用,反之如果在synchronized 范围内,监视器发挥作用。

wait/notify必须存在于synchronized块中。并且,这三个关键字针对的是同一个监视器(某对象的监视器)。这意味着wait之后,其他线程可以进入同步块执行。

当某代码并不持有监视器的使用权时(如图中5的状态,即脱离同步块)去wait或notify,会抛出java.lang.IllegalMonitorStateException。也包括在synchronized块中去调用另一个对象的wait/notify,因为不同对象的监视器不同,同样会抛出此异常。

  • volatile

    请参考:
    http://www.cnblogs.com/dolphin0520/p/3920373.html#undefined
    https://www.ibm.com/developerworks/cn/java/j-jtp06197.html

  • Lock
    请参考:
    http://www.cnblogs.com/dolphin0520/p/3923167.html

  • synchronize