zoukankan      html  css  js  c++  java
  • java多线程的理解

    java多线程的理解

     

    线程的5种状态:新建,就绪,运行,阻塞,死亡。

    Thread.sleep:线程  运行状态 转为  阻塞状态,(其它线程启动运行)

    Thread.yield:   线程 运行状态 转为 就绪状态,(同优先级线程启动运行)

    ThreadA.join:等待ThreadA执行完成。

    线程的两种方式:

    继承自Thread,实现Runnable.

    在线程中看是否有操作的同一对象的实例。如果有的话要考虑线程的同步和互斥。通俗点来说就是某个类的某个成员变量会有多个线程访问。

    线程的同步

    同步代码块:同步加锁的是对象,而不是代码。

    synchronized(Object A){

    }

    同步监视器是A,表示的是一个临界区。

    同步方法:

    synchronized Method1(){

    }

    synchronized Method2(){

    }

    同步锁:

    Lock lock = new ReentrantLock();

    public Mehtod1(){

    lock.lock();

    finally{

         lock.unlock();

    }

    }

    public Mehtod2(){

    lock.lock();

    finally{

         lock.unlock();

    }

    }

    同步监视器的释放:

    1.当前线程的同步方法或者同步代码块执行结束,当前线程即释放同步监视器。

    2.在同步方法或者同步代码块中出现了error或者exception的时候。

    3.当线程执行同步方法或者同步代码块时,程序执行了同步监视器对象的wait方法,则当前线程,并释放同步监视器。

    下面的情况不会释放同步监视器:

    1.当线程执行同步方法或者同步代码块时,程序调用Thread.Sleep,Thread.Yield方法。

    2.当线程执行同步方法或者同步代码块时,其他线程调用了该线程的suspend方法将该线程挂起。

    线程的通信:

    同步方法块或者同步方法使用object的wait,notify和notifyAll三个方法来进行线程的通信。

    如果是同步方法块synchronized(Object a):则在代码中要使用a.wait,a.notify,a.notifyAll;

    如果使用的是同步方法synchronized methodA(),则同步监视器是this对象,可以直接在代码中使用wait,notify和notifyAll方法。

    wait:导致当前的线程等待,并且释放当前的同步监视器。直到其他线程调用该同步监视器的notify方法和notifyall方法。

    notify:唤醒在此监视器上等待的单个线程,但是选择是任意的。

    notifyAll:唤醒在同步监视器上等待的所有线程。

  • 相关阅读:
    一致性哈希算法
    Discourse 的标签(Tag)只能是小写的原因
    JIRA 链接 bitbucket 提示错误 Invalid OAuth credentials
    JIRA 如何连接到云平台的 bitbucket
    Apache Druid 能够支持即席查询
    如何在 Discourse 中配置使用 GitHub 登录和创建用户
    Apache Druid 是什么
    Xshell 如何导入 PuTTYgen 生成的 key
    windows下配置Nginx支持php
    laravel连接数据库提示mysql_connect() :Connection refused...
  • 原文地址:https://www.cnblogs.com/isoftware/p/3780863.html
Copyright © 2011-2022 走看看