Java多线程编程核心技术( 五 )


在执行同步块中 , 遇到异常而导致线程终止 , 锁也会被释放
18.5 只通知一个线程
()一次只随机通知一个线程进行唤醒 。
当多次调用()时 , 会随机将wait状态的线程唤醒
18.6 唤醒所有线程:()
18.7 方法wait(long)使用
wait(long)带一个时间参数 , 等待某一时间内是否有线程对锁进行唤醒 , 如果超过这个时间则自动唤醒 。
18.8 通知过早
如果通知过早会打乱程序的正常运行逻辑
18.9 等待wait的条件发生变化
如果wait等待的条件发生率变化 , 也容易造成程序逻辑的混乱 。
19 生产者消费者模式 (没看懂)
20.通过管道进行线程间的通信:字节流/字符流
用于在不同线程间直接传送数据 。一个线程发送数据到输出管道 , 另一个线程从输入管道中读数据 , 通过使用管道 , 实现不同线程间通信 , 而无需借助类似临时文件之类的东西 。


.()/ .();
.() / .()
21.join()
在很多情况下 , 主线程创建并启动子线程 , 如果子线程中要进行大量的耗时运算 , 主线程将远远早于子线程结束之前结束 。这时 , 如果主线程想等待子线程执行完成之后再结束 , 如果子线程要处理一个数据 , 主线程要取得这个数据中的值 , 就要用到join 。
join()作用:等待线程对象销毁
21.1 join与
join使线程排队运行 , 内部使用wait进行等待
使用“对象监视器”原理作为同步
21.2 join()与()
在join过程中 , 如果当前线程被中断 , 则当前线程抛出
21.3 join(long)
参数设定等待时间
21.4 join(long)与sleep(long)区别
join(long)在内部使用wait(long)来实现 , 所以join(long)具有释放锁的特点
sleep(long) 不释放锁
22
变量值的共享可以使用 变量的形式 , 所有的线程都使用同一个 变量 。
如果想每一个线程都有自己的共享变量 , 就需要使用来解决 。
23 al
在子线程中取得父线程继承下来的值 。
如果子线程在取得值的同时 , 主线程将al中的值进行更改 , 那么子线程取得的值还是旧值 。
24 jdk 5以后的Lock也能实现同步
24.1.
实现线程之间的同步互斥 , 还具有嗅探锁定 , 多路分支通知等功能 。
对象的lock()获取锁 , ()释放锁 。
调用lock()就持有了“对象监视器” , 其他线程只有等待锁被释放时再次争抢 。线程之间还是顺序执行 。
24.2 使用实现等待/通知
在jdk5中出现 , 可以实现多路通知功能 , 即在一个Lock对象里可以创建多个(对象监视器)实例 , 线程对象可以注册在指定的中 , 从而可以有选择性的进行线程通知 , 在调度线程上更灵活 。
在使用()或者()进行通知时 , 被通知的线程时jvm随机选择的 , 但是用结合类是默认提供的 。
就相当于整个Lock对象中只有一个单一的对象 , 所有的线程都注册在它一个对象身上 。线程开始()时 , 需要通知所有的线程 , 没有选择权 , 会出现相当大的效率问题 。

Java多线程编程核心技术

文章插图
正确使用实现等待/通知:
Java多线程编程核心技术

文章插图