zoukankan      html  css  js  c++  java
  • java 线程同步 原理 sleep和wait区别

    java线程同步的原理
    java会为每个Object对象分配一个monitor

    当某个对象(实例)的同步方法(synchronized methods)被多个线程调用时,该对象的monitor将负责处理这些访问的并发独占要求任何时刻,对一个指定object对象(实例)的某同步方法只能由一个线程来调用。

    java对象的monitor是跟随object实例来使用的,而不是跟随程序代码。两个线程可以同时执行相同的同步方法,比如:一个类的同步方法是xMethod(),有a,b两个对象实例,一个线程执行a.xMethod(),另一个线程执行b.xMethod().互不冲突

    wait()、notify(),notifyAll()的使用
    obj.wait()方法将使本线程挂起,并释放obj对象的monitor。只有其他线程调用obj对象的notify()或notifyAll()时,才可以被唤醒。
    obj.notifyAll()方法唤醒所有该obj对象相关的沉睡线程,然后被唤醒众多线程开始竞争obj对象的monitor占有权,最终得到的那个线程会继续执行下去,但其他线程还将继续等待。
    obj.notify()方法是随机唤醒一个沉睡线程。
    wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,
    如:
    synchronized(x){
    x.notify()//或者wait()
    }
    以上内容说明了为什么调用wait(),notify(),notifyAll()的线程必须要拥有obj实例对象的monitor占有权。
    每个对象实例都有一个等待线程队列。这些线程都是等待对该对象的同步方法的调用许可。对一个线程来说,有两种方法可以进入这个等待线程队列。一个是当其他线程执行同步方法时,自身同时也要执行该同步方法;另一个是调用obj.wait()方法。
    当同步方法执行完毕或者执行wait()时,其他某个线程将获得对象的访问权。当一个线程被放入等待队列时,必须要确保可以通过notify()的调用来解冻该线程,以使其能够继续执行下去。

    三。 wait()与sleep()的区别:
    sleep()函数是Thread类的静态函数,不涉及到线程间同步概念,仅仅为了让一个线程自身获得一段沉睡时间。sleep可以在任何地方使用。

    wait函数是object类的函数,要解决的问题是线程间的同步,该过程包含了同步锁的获取和释放,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者。
    注意,线程调用notify()之后,只有该线程完全从synchronized代码里面执行完毕后,monitor才会被释放,被唤醒线程才可以真正得到执行权

    sleep是执行sleep那个线程自己的事情

    wait是多个线程之间的协调(有竞争)

    http://blog.csdn.net/mxlxiao7/article/details/7971084

    --希望是生命的瑰丽朝霞,我们应当在希望中生活,并在希望中奋进,去开拓我们的人生之路。
  • 相关阅读:
    vscode常用插件
    2019前端面试总结
    用户注册登录的逻辑
    Vue项目各个文件夹的作用
    Gulp & webpack 配置详解
    Webpack 配置入门
    开始一个React项目(一)一个最简单的webpack配置
    资源加载过程
    关于Netty Pipeline中Handler的执行顺序问题
    解压版中文乱码问题MYSQL中文乱码
  • 原文地址:https://www.cnblogs.com/nulisaonian/p/6054075.html
Copyright © 2011-2022 走看看