java多线程知识点整理

java多线程知识点整理

State枚举类

这里写图片描述
这里写图片描述

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

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

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

这里写图片描述

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

锁对象的队列

每个锁对象都有两个队列,一个是就绪队列,一个是阻塞队列,就绪队列存储了将要获得锁的线程,阻塞队列存储了被阻塞的线程,当一个被线程被唤醒 (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解决的是多个线程之间访问资源的同步性。

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

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值