synchronized的wait(),notify(),not
本文来自于读取:http://blog.csdn.net/lingzhm,原博客更精髓。
wait()方法——暂停当前线程,释放当前锁,线程进入等待状态;
notify()方法——执行完毕当前代码块后,释放锁,唤醒在等待状态的线程();(如果又多个需要相同锁的等待线程,会随机唤醒其中一个)
notifyAll()方法——当前代码块执行完毕,释放锁,唤醒在等待状态的所有线程();
以上方法都是相对于synchronized代码块中调用。
线程安全问题:多线程在调用同一个方法,或者多个方法时候的时候,运行得出错误的结果或者数据错误。
如何处理线程安全问题?
采用序列化访问临界资源,几同一时间只能有一个线程访问该方法。
示例说明:小米盒子通过USB看门狗以及显示屏幕,对看门的控制的时候需要经命令写入看门狗执行区,
例如 12345--开启看门狗
6789--关闭屏幕
如果多线程同时调用开启动看门狗以及关闭看门狗的方法时,在执行区可能会形成167893456不是别的乱码,
这是我们就需要采用synchronized来修饰方法或者代码块。
死锁现象:(只有一个车能经过的马路,两辆互不相让的车在同时经过这条马路的时候就会一直僵持下去,谁也走不了了,这个比喻不是很恰当。。。。);
直接看图:
概念图解说:首先度对左侧这一个线程进行说明:在具有锁1代码块中包含具有锁2的代码块
右侧线程说明:在具有锁2代码块中包含具有锁1的代码块
当两个线程同时执行到绿色横线位置的时候,
左侧线程:当前具有锁1,并且需要锁2,才能继续执行,否则将无法像下执行。
右侧线程:当前具有锁2,并且需要锁1,才能继续执行。
由于锁2在右侧线程中,并且当前无法释放,导致左侧线程无法执行下去,
同样由于锁1在左侧线程中,并且当前无法释放,导致右侧线程无法释放。
结果导致两个线程都无法执行下去,称为死锁现象
如何处理死锁现象?
笔者认为首先要在逻辑上防止情况的发生。
可以采用超时判断
若有错误之处,请给予指示,谢谢~~~~~