美文网首页Android 技术开发
synchronized的wait(),notify(),not

synchronized的wait(),notify(),not

作者: 沈凤德 | 来源:发表于2017-01-16 14:54 被阅读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在左侧线程中,并且当前无法释放,导致右侧线程无法释放。

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

    如何处理死锁现象?

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

    可以采用超时判断


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

    相关文章

      网友评论

        本文标题:synchronized的wait(),notify(),not

        本文链接:https://www.haomeiwen.com/subject/gkoubttx.html