第三章:线程间通信

  1. 一句话总结wait和notify: wait使线程停止运行, 而notify使停止的线程继续运行。

  2. wait()执行后,线程进入等待线程队列,释放锁。notify()执行后,并不立即释放锁,后面语句要执行完才释放。
    关键字synchronized可以将任何一个Object作为同步对象看待,JAVA为每一个Object都实现了wait()和notify()
    方法。 wait()和notify() 必须用在synchronized的同步区类。
    notify() 方法可以随机唤醒等待队列中等待同一共享资源的“一个”线程,使该线程退出等待队列,进入可运行状态。
    notifyAll()方法可以使所有正在等待同一共享资源的“全部”线程从等待状态退出,进入可运行状态。

  3. 每个锁对象都有两个队列,一个是就绪队列,一个是阻塞队列。

  4. sleep()和wait() 的区别
    a, sleep() 方法是Thread类中的方法, wait()是Object类中的方法
    b, sleep() 不释放锁。

  5. wait()和notify() 最常用于 生产者和消费者模式实现。
    在一个生产者和一个消费者时,是没有问题的。
    但是在多个生产者和 多个消费者时就很可能出现 “假死” 的现象。 即所有的线程都处于WAITING状态。
    因为all用的都是同一把锁, notify不能保证唤醒是异类,也许是同类。 生产者唤醒生产者…
    解决方案超级简单, 把生产者和消费者中所有的notify()都改成notifyAll()

  6. 一个生产者 对 多个消费者 进行栈操作 很可能出现异常。
    问题在于if语句作为条件判断,因为条件发生改变时没有得到及时的响应。将if改成while,但是会
    出现新的问题—假死—> 改成notifyAll();

  7. 用管道流进行线程间的通讯:字节流
    PipeInputStream 和 PipeOutputStream.最主要是把输入流和输出流联系起来。
    outputStream.connect(inputStream)

  8. join 的作用是等待线程对象销毁。
    join(long) 和 sleep(long)的区别:(都是等多久的事儿)
    a, join(long)的功能在内部使用wait(long) 方法来实现, 所以具有释放锁的特点。 sleep(long)
    是不会释放锁的。

  9. join() 后面的代码提前运行:解释意外
    这个直接没看懂,先pass掉。

  10. 所有的线程都使用同一个变量值 public static。 如果要实现每一个线程都有自己的共享变量值:ThreadLocal.
    ThreadLocal解决的是变量在不同线程间的隔离性,也就是说不同的线程拥有自己的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值