1. 通信
    1. 4个问题
      1. 线程间如何传递信息
      2. 线程之间如何同步
        1. 以使一个线程的活动不会破坏另一个线程的活动
      3. 当线程间具有依赖关系时,如何调度多个线程的处理顺序
      4. 如何避免死锁问题
    2. java 3个方法
      1. wait()
        1. 使调用该方法的线程释放共享资源的锁,然后从运行态退出,进入等待队列,直到被再次唤醒
        2. wait()方法使得当前线程必须要等待,等到另外一个线程调用notify()或者notifyAll()方法。
        3. 当前的线程必须拥有当前对象的monitor,也即lock,就是锁。
        4. 线程调用wait()方法,释放它对锁的拥有权,然后等待另外的线程来通知它(通知的方式是notify()或者notifyAll()方法),这样它才能重新获得锁的拥有权和恢复执行。
        5. 要确保调用wait()方法的时候拥有锁,即,wait()方法的调用必须放在synchronized方法或synchronized块中。
        6. 一个小比较:Thread.sleep()
          1. 它会导致线程睡眠指定的毫秒数,但线程在睡眠的过程中是不会释放掉对象的锁的。
      2. notify()
        1. 唤醒等待队列中第一个等待同一共享资源的线程,并使该线程退出等待队列,进入可运行态
        2. 被唤醒的线程是不能被执行的,需要等到当前线程放弃这个对象的锁。
        3. 竞争,来获得对象的锁
        4. notify()方法应该是被拥有对象的锁的线程所调用。
        5. wait()和notify()方法要求在调用时线程已经获得了对象的锁,因此对这两个方法的调用需要放在synchronized方法或synchronized块中。
      3. notifyAll()
        1. 使所有正在等待队列中等待同一共享资源的线程从等待状态退出,进入可运行状态,此时,优先级最高的那个线程最先执行
      4. 只有在synchronized关键字作用的范围内,并且是同一个同步问题中搭配使用这3个方法时才有实际的意义
  2. java.util.concurrent 包
  3. 共享内存
    1. 让工作类继承Runable,这样方便多个Thread使用同一个工作类,从而读取同一个工作类的成员变量。
  4. java进程
    1. 调用的是操作系统的进程
    2. 进程之间的通信需要在内核的环境
    3. 进程间通信
      1. 管道
      2. 系统IPC(Inter-Process Communication,进程间通信)
        1. 消息队列
        2. 信号
        3. 共享存储
        4. 套接字
  5. 几个方法
    1. sleep()和wait()
      1. 调用sleep()方法并不会让线程释放它所持有的同步锁;而且在这期间它也不会阻碍其它线程的运行。
    2. yield()
      1. 让当前运行Thread放弃其所占用的cpu时间片,以便让其他Thread运行
      2. 让Thread能适当地轮转
      3. 即使当前Thread放弃时间片,可是还有可能再次被JVM选中!也就是连任。
    3. join()
      1. 让当前Thread加入到myThread线程的尾部,意味着myThread线程运行结束之前,当前Thread不会运行。
  6. 引发死锁四个条件
    1. 互斥(Mutual exclusion)
      1. 线程所使用的资源中至少有一个是不能共享的,它在同一时刻只能由一个线程使用。
    2. 持有与等待(Hold and wait)
      1. 至少有一个线程已经持有了资源,并且正在等待获取其他的线程所持有的资源。
    3. 非抢占式(No pre-emption)
      1. 如果一个线程已经持有了某个资源,那么在这个线程释放这个资源之前,别的线程不能把它抢夺过去使用。
    4. 循环等待(Circular wait)