java多线程知识点整理

java多线程知识点整理

State枚举类

java多线程知识点整理_第1张图片
java多线程知识点整理_第2张图片

下面详细说明一下线程各状态表示的意思:

  • NEW:至今尚未启动的线程处于该状态,通俗来讲,该状态是线程实例化后还从未执行start()方法的状态;
  • RUNNABLE:正在java虚拟机中执行的线程处于这种状态;
  • BLOCKED:受阻塞并等待某个监视器锁的线程处于这种状态;
  • WAITING:无限期地等待另一个线程来执行某一特定操作的线程处于这种状态;
  • TIMED_WAITING:等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态;
  • TERMINATED:已退出的线程处于这种状态,线程被销毁。

下面是方法与线程状态关系示意图

java多线程知识点整理_第3张图片

在调用与线程相关的方法后,会进入不同的状态。

锁对象的队列

每个锁对象都有两个队列,一个是就绪队列,一个是阻塞队列,就绪队列存储了将要获得锁的线程,阻塞队列存储了被阻塞的线程,当一个被线程被唤醒 (notify)后,才会进入到就绪队列,等待获得锁。

如果不使用notify 那么阻塞队列里的线程将一直处于阻塞状态,即使就绪队列里的线程都执行完了,阻塞队列里的线程也将一直处于阻塞状态。

synchronized与volatile

  • synchronized关键字加到static静态方法上是给class类上锁,也就是多线程访问该class加载的任何实例的synchronized方法都会有阻塞问题;而加到非static静态方法上是给对象上锁,也就是不同对象,同一时刻可以访问同一个syncronized方法或其他syncronized方法,两个对象之间并不产生互斥关系。
  • volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。如果不加volatile修饰实例变量,则它是从线程私有数据栈中取值。

二者比较:

  1. volatile是线程安全的轻量级实现,所以volatile性能肯定比synchronized要好,且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。
  2. 多线程访问volatile不会发生阻塞,而synchronized会发生阻塞。
  3. volatile能保证数据可见性,但不能保证原子性(不可分割,不能有其余线程插入);而synchronized可以保证原子性,也可以间接保证可见性,因为它会将私有内存和公有内存中的数据做同步。
  4. volatile解决的是变量在多个线程之间的可见性;而synchronized解决的是多个线程之间访问资源的同步性。

原子操作是不能分割的整体,没有其他线程能够中断或检查正在进行原子操作中的变量。

你可能感兴趣的:(Java学习笔记)