Java并发编程-线程有关概念

线程安全

  • 不可变的对象一定是线程安全的,如:
  • final修饰的不可变类:String,Integer
  • enum 枚举类
// 编译
javac xxx.java

//反编译
jad xxx.class

同步

  • 阻塞式调用,调用方必须等待响应方执行完毕才会返回
    在这里插入图片描述
  • 同步使用场景:

1、大多数非异步场景(不用异步,就用同步来调用)

  如:百度搜索,客户端同步调用服务端搜索接口,等待服务端实时结果

2、在编排的流程中,必须等待拿到响应结果才能去做下一步操作,且在实时链路中相互之间有串联或关联数据的。

  如:电商中商品详情页的查询接口的内部实现

异步

  • 非阻塞式调用,立即返回,调用方无需等待响应方返回实际结果,响应方会通过状态、通知或回调来告知调用方
    在这里插入图片描述
  • 异步使用场景:

1、耗时任务,主线程中提交耗时任务到线程池,然后通过Feture来异步获取任务执行结果,这里也可以由异步任务发消息等途径来通知主线程。
在这里插入图片描述
2、电商下单链路的非核心链路调用,为了下单的性能考虑,将订单下发的发货仓库等非实时流程放在后续操作,提高下单的响应速度。 如:这里交易系统通过消息自发自接等方式来驱动后续流程

同步异步优劣势比较

在这里插入图片描述

阻塞

  • 调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回

非阻塞

  • 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程,而会立即返回。

单线程程序

  • 程序执行过程中始终只有一个线程在运行,后面的代码段必须等到前面代码段的任务执行完毕后才能执行,这样的程序可以认为是单线程程序。

多线程程序

  • 程序由多个线程构成,方法内各代码块执行顺序是不确定的,这样的程序可以认为是多线程程序。

并发

  • 逻辑上的同时处理。能处理多个事件,但是并不一定是同时进行的。
  • 这里可能只有一个处理器的多个线程,由系统的调度,让不同的线程在不同的小的时间段内执行各自的线程任务逻辑。
    在这里插入图片描述

并行

  • 物理或是实际的同时处理。能在同一时刻处理多个事件。
  • 并行具有并发的含义,并发不一定是并行的,因为不是同时进行。
    在这里插入图片描述

线程的状态

  • NEW:线程创建但是还没有调用start()方法
  • RUNNABLE :可运行线程的状态,线程已经在JVM虚拟机中执行,但是可能需要等待操作系统资源,如处理器。RUNNABLE包括RUNNING和READY
  • BLOCKED :阻塞的线程意味着正在等待监视器锁,来进入或重入synchronized代码块或者方法
  • WAITING :等待状态,需要其他线程中断或通知来唤醒
  • TIMED_WAITING:定时等待状态,在指定等待时间后返回,或提前被其他线程中断或通知返回
  • TERMINATED:终止线程的线程状态,线程已执行完成

线程的状态切换

在这里插入图片描述

线程方法

Thread.yield()
  • 线程让步,使用了这个方法,当前线程就会退出CPU时间片,让其他线程或当前线程使用CPU时间篇执行
Thread.sleep()
  • 线程休眠,主动让出当前CPU时间,在指定时间过后,CPU会返回继续执行该线程。sleep方法不会释放当前所持有的锁
Thread.join()
  • 等待该线程死亡/终止,当前线程会等待调用该方法的线程执行完毕后才能继续执行
Object.wait()
  • Object类的方法,调用前必须拥有对象锁,例如在synchronized代码块内,调用wait方法后,对象锁会释放,线程进入WAITING等待状态

线程死锁

  • 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
  • 两个及以上的线程,抢占2把及以上的锁,抢占锁的顺序不一致
    在这里插入图片描述

避免和处理死锁问题

1.不使用锁,不使用2把及以上的锁

2.必须使用2把及以上锁的时候,确保在整个应用程序中对获取锁的顺序是一致的

3.尝试获取具有超时释放的锁,例如Lock中的tryLock来获取锁

4.当发生了Java-level的锁时,重启程序来干掉进程/线程

定位死锁问题

  • jps
    列举正在运行的虚拟机进程并显示虚拟机执行的主类以及这些进程的唯一ID(PID)

  • jstack
    用于JVM当前时刻的线程快照,得到JVM当前每一条线程正在执行的堆栈信息,定位线程长时间卡顿问题,如死锁、死循环等问题

#Java##学习路径#
全部评论
感谢参与【创作者计划2期·技术干货场】!欢迎更多牛油来写干货,瓜分总计20000元奖励!!技术干货场活动链接:https://www.nowcoder.com/link/czz2jsghtlq(参与奖马克杯将于每周五结算,敬请期待~)
点赞 回复
分享
发布于 2021-03-06 11:35

相关推荐

3 17 评论
分享
牛客网
牛客企业服务