多线程基础概念-上下文切换和死锁

多线程基础概念-上下文切换和死锁

上下文切换

###1. 什么是上下文切换

cpu通过时间片分配算法来分配各个线程执行的时间。当一个线程执行了一个时间片之后就会切换到下一个线程的时间片。但是,在切换之前会保存当前线程的执行状态(程序计数器)以便于在切换回这个线程后能够继续上一个时间片执行。简单来说线程任务从保存到切换回来的这个过程就是一次上下文切换

###2. 为什么上下文切换会影响线程执行速度

简单来说就是切换回当前线程后,当前线程需要到程序计数器找到上一个时间片执行的状态,来继续执行后续动作。就好像是我正在看当前的文章,但是我女友要求我送她去上班(被优先级更高的任务抢占)。当送完她之后回到书桌前, 我需要回忆之前读到哪一部分了。这回忆的动作就是上下文切换,增加了我读文章的时间。

死锁

1. 什么是死锁

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

个人理解就是线程获取一个永远也得不到的资源。

2. 死锁产生的必要条件

  • 互斥条件:一个资源每次只能被一个进程使用,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。

  • 请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

  • 不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。

  • 循环等待条件: 若干进程间形成首尾相接循环等待资源的关系

3. 如何避免死锁

打破死锁产生的必要条件即可让死锁不成立。

  • 破坏请求和保持条件:在一个任务开始时,就要获得所有的资源,否则不执行任务。
  • 破坏不可剥夺条件和请求与保持条件:当任务等待其他资源时,释放自己占有的资源。
  • 循环等待条件:按一定规则对资源排序,任务必须按顺序获得资源。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Java高级特性中的多线程基础是指使用线程来实现并发执行的程序。线程是程序执行的最小单位,可以同时执行多个线程,提高程序的执行效率和响应速度。在Java中,使用Thread类和Runnable接口来创建和启动线程。线程的基本操作包括创建、启动、暂停、恢复和停止等。在多线程编程中,需要注意线程安全和同步问题,避免出现数据竞争和死锁等问题。 ### 回答2: Java多线程基础是Java高级特性中重要的一部分,能够提升开发效率和程序性能。使用线程可以充分利用多核CPU的计算资源,实现程序并发执行,提高程序的响应速度和处理能力。在Java中,使用线程需要遵循以下几个基本步骤: 第一步,创建线程对象。Java中提供了两种方式,一种是继承Thread类,重写run()方法,另一种是实现Runnable接口,实现run()方法,然后将实现了Runnable接口的对象传递给Thread类的构造函数。 第二步,启动线程。使用start()方法启动线程,调用该方法后,线程会被放入就绪队列中,等待调度器选择执行。 第三步,执行线程。执行线程时,线程内部会调用run()方法执行任务。 第四步,终止线程。线程可以正常终止,也可以强制终止。正常终止线程可以使用return或者退出run()方法,强制终止线程可以使用stop()方法。 在使用线程的过程中,需要注意几点: 第一点,线程安全。多个线程同时访问共享数据时,可能会引发数据竞争和安全问题。Java提供了synchronized关键字和Lock接口实现线程同步,保证多线程访问共享资源时,数据的正确性和一致性。 第二点,线程的优先级和调度。Java中线程采用抢占式调度,优先级高的线程会先被调度执行。可以使用setPriority()方法设置线程的优先级,但是线程优先级设置过高也有可能导致低优先级的线程被饿死的问题。 第三点,线程的等待和唤醒。线程等待和唤醒是实现线程间通信的重要手段。Java中提供了wait()、notify()和notifyAll()等方法实现线程的阻塞和唤醒操作。 总之,使用Java多线程基础可以将代码的并发执行能力提高到极致,充分利用服务器CPU的多核计算资源,提升系统的性能和响应速度。但是,在使用多线程时需要注意线程安全和调度等问题,确保程序的正确性和稳定性。 ### 回答3: Java中的多线程是一项非常重要的高级特性,它可以让程序同时执行多个任务,从而提高程序的效率。多线程的实现方法主要包括继承Thread类和实现Runnable接口,其中继承Thread类的方式是比较简单的,但是并不推荐使用,因为它会导致类的继承关系变得复杂。 在使用多线程的时候,需要注意以下几个基础知识: 1. 线程的创建:可以通过继承Thread类或者实现Runnable接口来创建线程,线程的创建通常是在main方法中完成的,例如: Thread thread1 = new Thread(new Runnable() { @Override public void run() { // 线程要执行的任务 } }); 2. 线程的启动:线程创建后需要启动才能开始执行任务,可以通过调用start()方法来启动线程,例如: thread1.start(); 3. 线程的运行状态:线程在运行过程中会处于不同的状态,包括新建状态(new)、就绪状态(ready)、运行状态(running)、阻塞状态(blocked)和死亡状态(dead)等,可以通过getState()方法获取线程的当前状态。 4. 线程的常用方法:线程的常用方法包括sleep()、yield()、join()、interrupt()等,可以通过这些方法对线程进行管理和控制,例如: Thread.sleep(1000); // 线程休眠1秒 Thread.yield(); // 让出CPU时间片 thread1.join(); // 等待线程1执行完成 thread1.interrupt(); // 中断线程1的执行 在使用多线程的时候,需要注意线程之间的同步和互斥关系,避免出现线程安全问题。可以使用synchronized关键字来保证多个线程对同一个共享资源进行访问时的安全性,还可以使用Lock和Condition等高级同步工具来实现更细粒度的控制。此外,还可以使用线程池来管理和控制多个线程的执行,提高程序的效率和稳定性。 总之,Java中的多线程是一项非常重要的高级特性,掌握它对于Java程序员来说是必不可少的。在使用多线程的时候,需要注意线程的创建、启动、状态、常用方法和同步等方面的知识,同时要注意线程安全问题,避免出现程序错误。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锁五龙

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值