Java 多线程

时间:2019-06-18
本文章向大家介绍Java 多线程,主要包括Java 多线程使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

0 引言

  进程:一个正在执行中的程序,动态的,是系统进行资源分配和调度的独立单位。

  线程:进程中一个独立的控制单元,线程控制着进程的执行。一个进程中至少有一个线程。

1 创建线程

  创建线程的方式:Thread、Runable

  继承 Thread 类三步走:定义类继承 Thread 类、重写 run 方法、调用线程的 start 方法。

  实现 Runable 接口三步走:定义类实现 Runable 接口、实现 run 方法、通过 Thread 类建立线程对象、start方法。

  两种方式的区别:实现方式避免了单继承的局限性,线程代码存在接口子类的 run 方法中;继承方式线程代码存放在 Thread 子类的 run 方法中。

  线程的生命周期:就绪状态(线程 new 后)、可执行状态(start 方法启动线程,调用 run 方法)、阻塞状态(sleep 方法 和 wait 方法)、死亡状态(stop 方法)

2 内存模型

  java的内存模型,详见 JVM原理 

2.1 volatile(用来修饰被不同线程访问和修改的变量)

  1. 内存可见性:某线程对 volatile 变量的修改,对其他线程都是可见的。即获取 volatile 变量的值都是最新的。

  2. 禁止指令重排:JVM 在编译 Java 代码时或 CPU 在执行 JVM 字节码时,对现有指令顺序进行重新排序,优化程序的运行效率。

2.2 synchronized

  防止多个线程同时访问这个对象。

2.3 synchronized和volatile的区别

  1. volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的

  2. volatile仅能实现变量的修改可见性,并不能保证原子性;synchronized则可以保证变量的修改可见性和原子性

  3. volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞

  4. volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化

 3 wait和sleep方法

  1. wait方法:会释放锁

  2. notify/notifyAll:仅仅释放资源,不会释放锁

  

原文地址:https://www.cnblogs.com/huanghzm/p/11044972.html