线程通信的深入理解[java]

线程通信主要解决多线程中共享资源的有序操作问题。当多个线程需要访问和修改同一资源时,通信机制允许线程间交换信息,调整执行顺序,避免数据不一致。wait()、notify()和notifyAll()方法在同步机制中扮演关键角色,用于线程的阻塞、唤醒和资源抢占。线程通信确保了在没有线程安全问题的前提下,提高代码执行效率。
摘要由CSDN通过智能技术生成

关于线程通信的理解:

  1. 我们要知道线程的通信是要有多线程,我们线程的通信是要传输信息给我们的另外的线程,也就是我们的线程的通信的前提就是要多线程
  2. 这里我们有了多线程的前提之后假如说我们的多线程就是两个线程,这个时候我们的两个线程之间要通信,那么这两个线程为什么要通信呐?
    • 我们因为我们的线程之间有共享资源,如果这两个线程没有之间共享的资源,那么这两个线程就是各自做各自的事情,互不干扰
    • 但是如果我们的两个线程之间有了共享资源,这个时候我们的这两个线程在操作共享资源时就要考虑线程操作共享资源的顺序,这个时候就要考虑到线程的通信
      • 因为如果我们的两个线程之间有共享资源,那么我们就要考虑两个线程对这个共享资源的操作顺序(比如我们的两个线程要交叉执行还是要如何执行),因为有了共享资源之后我们就会有了特殊的要求,我们要求这两个线程对这个共享资源的要求要按我们的要求来,但是这个时候我们的CPU不知道我们是何种要求,这个时候就要我们给编写代码来制定CPU按我们的要求给多个线程之间分配资源
        • 那么这个时候我们就要是在一个线程的执行过程中来进行一些操作,比如说我们线程A执行完之后我们发出一命令,让我们的线程A放弃对当前同步显示器(锁)的操作权,并且进入此对象的线程等待池,这个时候我们的线程A被wait()方法执行了,这个时候我们的线程A也就是进入了阻塞状态,但是它放弃了对与同步监视器的执行权,那么这个时候我们的线程B就抢到了线程的执行权,这个时候我们就换成了线程B执行,然后我们线程B执行完之后再重复这样的操作,这样我们就是完成了交叉执行两个线程的目的,这个时候我们也就是通过线程的通信解决了线程的执行的执行顺序的改变
  • 所以我们说线程的通信就是为了完成我们多个线程之间的信息的转换,那么既然我们的信息要进行转换,所以我们就提出了wait()和notify()方法
    • 因为我们的线程之间要进行信息的交换,那么就涉及到我们的线程的切换,这个时候我们多个线程要进行切换,那么我们要如何让我们的线程进行切换?
    • 我们的两个线程要进行切换,那么就要多个线程交替来释放同步监视器,只有我们的一个线程释放了同步监视器,那么另外一个线程才会有可能抓住这个锁,也就是换成了我们的另外一个线程来执行这段同步代码
    • 这里还有一点,如果我们要完成线程的交替执行,这个时候我们只是让一个线程释放关于这个共享资源的同步监视器那么这个时候我们的这个线程还有可能会继续拿到这个同步监视器,就不能拿到交替执行多个线程的目的(所以我们使用sleep()方法达不到我么的线程通信的目的,因为我们的sleep()方法是让这个线程陷入阻塞状态,但是这个时候这个线程并没有放弃这个同步监视器,那么我们其他的线程就永远都抢不到这个共享资源(也就是被同步的代码)的执行权),这个时候我们就提出了wait()方法,
      • wait()方法: 让当前执行的线程进入阻塞状态,并且释放同步监视器
    • 但是我们的一个线程阻塞并且释放同步监视器之后,另一个线程再执行,执行完之后我们前面的线程还是处于阻塞状态,那么这个时候我们就要让我们在后面这个线程的执行过程中来唤醒第前面的线程,这个时候我们就提出了notify()方法和notifyAll()方法
      • notify()方法: 唤醒一个被wait()方法阻塞的线程,如果有多个线程被wait()方法执行,就是按优先级唤醒,优先级高的先被唤醒,同等优先级线程之间随机进行唤醒

线程通信的前提:

  1. 要是多线程

  2. 要有资源的共享

    多个线程之间没有资源的共享就没有线程的安全问题,如果没有线程的安全问题就没有必要使用同步机制,如果没有同步机制也就不能使用我们的wait()方法,notify()方法,notifyAll()方法,也就无法进行线程通信

总结:

  • 线程的通信就是多个线程之间要进行信息的交换,达到改变线程的执行顺序,状态的目的
  • 线程的通信是书写在同步机制中的,而我们的同步机制就是为了解决我们的线程的安全问题,如果我们没有线程安全问题,那么我们也就没有必要来使用同步机制了,因为我们使用同步机制就会降低代码的执行效率,而我们线程有安全问题又是建立在多个线程操作同一份共享资源的基础上,所以也就是说我们只有多线程之间有资源的共享,那么我们的线程通信才有意义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值