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. 有序性 : 一个线程观察其他线程中的指令执行顺序,由于指令重排序的存在,该观察结果一般杂乱无序

  

原文地址:https://www.cnblogs.com/liunx1109/p/11443664.html