Android 技术开发

synchronized的wait(),notify(),not

2017-01-16  本文已影响36人  沈凤德

本文来自于读取:http://blog.csdn.net/lingzhm,原博客更精髓。


wait()方法——暂停当前线程,释放当前锁,线程进入等待状态;

notify()方法——执行完毕当前代码块后,释放锁,唤醒在等待状态的线程();(如果又多个需要相同锁的等待线程,会随机唤醒其中一个)

notifyAll()方法——当前代码块执行完毕,释放锁,唤醒在等待状态的所有线程();

以上方法都是相对于synchronized代码块中调用。

线程安全问题:多线程在调用同一个方法,或者多个方法时候的时候,运行得出错误的结果或者数据错误。

如何处理线程安全问题?

采用序列化访问临界资源,几同一时间只能有一个线程访问该方法。

示例说明:小米盒子通过USB看门狗以及显示屏幕,对看门的控制的时候需要经命令写入看门狗执行区,

例如  12345--开启看门狗

          6789--关闭屏幕

如果多线程同时调用开启动看门狗以及关闭看门狗的方法时,在执行区可能会形成167893456不是别的乱码,

这是我们就需要采用synchronized来修饰方法或者代码块。

死锁现象:(只有一个车能经过的马路,两辆互不相让的车在同时经过这条马路的时候就会一直僵持下去,谁也走不了了,这个比喻不是很恰当。。。。);

直接看图:

概念图

解说:首先度对左侧这一个线程进行说明:在具有锁1代码块中包含具有2的代码块

右侧线程说明:在具有锁2代码块中包含具有1的代码块

当两个线程同时执行到绿色横线位置的时候,

左侧线程:当前具有锁1,并且需要锁2,才能继续执行,否则将无法像下执行

右侧线程:当前具有锁2,并且需要锁1,才能继续执行。

由于锁2在右侧线程中,并且当前无法释放,导致左侧线程无法执行下去,

同样由于锁1在左侧线程中,并且当前无法释放,导致右侧线程无法释放。

结果导致两个线程都无法执行下去,称为死锁现象

如何处理死锁现象?

笔者认为首先要在逻辑上防止情况的发生。

可以采用超时判断


若有错误之处,请给予指示,谢谢~~~~~

上一篇下一篇

猜你喜欢

热点阅读