zoukankan      html  css  js  c++  java
  • Java并发编程

    一、多线程创建的方法

      1.正确创建线程的方式

       a.继承Thread类

       b.实现Runnable的接口

      2.Thread和Runnable的对比

       a.Runnbale方式实现已经对Thread创建对象解耦,而用继承Thread方法没有实现对象的解耦

       b.如果使用Thread方式创建对象,每次创建一个新的任务,只能新建一个独立的线程,这样操作对CPU消耗较大,而采用Runnable或者线程池就可以大大减少消耗

       c.Java不支持双继承,而Runnable可以多重实现接口,从而实现代码的可扩展性

      3.创建线程方式有四种

       a.继承Thread类

       b.实现Runnable接口(无返回参数线程)

       c.实现Callable接口(有返回参数线程)

       d.创建线程池

       e.定时器

      4.前沿技术的网站 : https://ohmyrss.com/    https://www.infoq.cn

    二、启动线程正确方式

      1.一次线程调用两次start之后会有什么问题?

        它会抛出一个线程错误状态的异常,线程自身会做检查

    三、中断线程的方法        interrupt和interrupted区别

      1.优先选择----> 中断传递 : 优先选择在方法上抛出异常(签名中抛出异常),这样可以传递到顶层,这样防止底层吞掉或者漏掉(底层使用try/catch的方法把代码漏掉或者吞掉)

      

      2.不想或者无法传递中断-------> 恢复中断

       在方法中恢复中断,调用Thread.currentThread().interrupt()来回复中断到顶层

          

      3.Java异常体系

       

      4.错误演示中断代码,使用volate boolean来处理中断

       volate boolean 无法处理长时间阻塞的状态

       当线程处于长时间阻塞状态下,就没有办法及时唤醒线程

       

      四、线程的生命周期

        1.生命周期包括

         New : 已经创建但是还没有启动,调用start方法之前

         Runnable : 线程已经启动,已经调用start方法

         Blocked :  已经进行synchorized 修饰之后,进入阻塞状态

         Waiting

         Timed Waiting

         Terminated

         

      五、Thread和Object方法详解

        1.阻塞阶段、唤醒阶段、遇到中断三个执行过程

           阻塞阶段 : wait的方法

         唤醒阶段: 

         

      五、多线程性能

         

          

      六、Java内存模型、Java数据结构、Java对象模型

        1.Java内存模型:原子性、可见性、重排序

        2.重排序:

        3.死锁产生的条件

         a.必须在多个线程条件下

         b.自己持有一个锁并且还持有其他锁

         c.构成一个环路 

        4.如何避免死锁的产生

         a.多使用并发类,尽量不要自己设计

         b.能使用同步代码块尽量不要使用同步方法

         c.避免锁的嵌套

         d.尽量根据不同业务使用不同的锁

        5.生产者消费者模型

    class ConsumerProducer{
    LinkedList list = new LinkedList();
    public synchronized void put(){
    while (list.size() == 10){
    try {
    wait();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    list.add(new Date());
    notify();
    }

    public synchronized void take(){
    while (list.size() == 0){
    try {
    wait();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    list.poll();
    notify();
    }
    }

       

       

    一、Java内存同步8种操作

       

        

      1.lock : 作用于主内存的变量,把一个变量标识为一条线程独占的状态

      2.unlock : 作用于主内存的变量,把一个处于锁定的状态的变量释放出来,释放后的变量才可以被其他的线程的访问

      3.read : 作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作的使用

      4.load : 作用于工作内存的变量,它把read操作从主内存中得到的变量值放入到工作内存的变量的副本中

      5.use : 作用于工作内存的变量,把工作内存中的一个变量传递给执行引擎

      6.assign : 作用于工作内存的变量,它把一个从执行引擎接收到的赋值给工作内存的变量

      7.store : 作用于工作内存的变量,把工作内存中的一个变量的值传递到主内存中,以便所有write的操作

      8.write : 作用于主内存的变量,它把store操作从工作内存中一个变量的值传递到主内存的变量中

      

    二、线程的安全性的讲解

      1.线程安全性包括的内容

       a. 原子性 : 提供互斥访问,同一时刻只能有一个线程来对它进行操作    synchronized

       b. 可见性 : 一个线程对主内存的修改可以及时的被其他线程观察到  volatile(不具有原子性,禁止指令重排序)

       c. 有序性 : 一个线程观察其他线程中的指令执行顺序,由于指令重排序的存在,该观察结果一般杂乱无序

      

  • 相关阅读:
    01-数字转人民币读法
    词组缩写
    字符串区间比较
    字符串读入
    回文数判断
    字符串加密
    字母统计
    互质的数
    【Tools】Anaconda Operaction
    【mmwave】DeviceSurvey
  • 原文地址:https://www.cnblogs.com/liunx1109/p/11443664.html
Copyright © 2011-2022 走看看