您的位置:首页 > 编程语言 > Java开发

Java 回顾笔记_多线程_线程通讯1

2016-03-13 11:09 375 查看


等待/唤醒机制:



这些方法一定要注意在哪个锁里面,如果你wait是在A锁里面,那么就要用A

锁的notify来唤醒,其他锁不行.

一个锁就是一个独立的线程池;

如:有一个同步的锁是A,一个同步的锁是B。那么就有两个线程池



——————

等待/唤醒的优化:

因为一般我们的变量需要封装起来,所以我们需要提供方法给外部访问,

所以我们同步直接写在方法中即可。





——————

多生产者多消费者问题:

为什么单生产单消费不出问题,而线程多了 就会出现问题?



一共有t0 t1 t2 t3 四个线程 每边两个线程.

一开始我们使用if()做判断,结果我们发现会出现多输出,多输入。就是说例如

我们生产了 2只烤鸭,但是只消费了一只。或者一只烤鸭被消费了几次。

这种情况就是说 当我们t0 生产完,却唤醒了 t1 ,因为他们都在等到状态,

所以不需要再判断flag 所以又生产了一只烤鸭。

为了让他等待完之后 在判断,我们使用while循环.

但是 又产生了死锁,因为 t0 唤醒了 t1 结果t1又进入等待,然后 t0获得执行权,又进来

结果又进入了等待。所以 所有线程都在等待状态,变成了死锁。

——————

多产生多消费问题的解决:

 对于上面的问题,我们想如果可以 直接唤醒 对方的 线程就可以解决问题,

但是没这种方法,所以我们唤醒所有的线程就可以。



但是这个方法是以前的解决方法,效率很低。因为把所有的都唤醒。

————————

解决此问题的JDK1.5的新特性_LOCK;



___

解决此问题的JDK1.5的新特性_condition;

因为一开始synchronize使用的锁是这个线程的对象,

对于一个synchronize来说 一个同步上面只有一组 监视器 ,

wait 和notify notifyall.

condition将这组监视器单独封装了。所以可以实现多个组的wait notify notifyall.



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java