java线程间通信方式

1.同步

就是通过Synchronized关键字来进行同步访问控制,确保谁拿到了相应的锁才能执行相应的操作

本质上就是共享内存式的通信,这个共享内存在java的内存模型中就是主内存,相当于通过主内存的数据进行线程通信。因Synchronized解锁时会将工作内存中的数据刷新到主内存中,Synchronized加锁时会将工作内存中的值清空从主内存读。多个线程访问同一变量,谁拿到了锁谁就去访问。

2.while轮询

假设我们添加线程向一个List中存入元素(一直存入),判断线程判断如果存入的元素达到了3个,我们就退出存入元素的线程,转而进入另一个等待它存入三个元素的线程。那么这个等待的线程我们使用while轮询list集合中是否达到了三个,如果到了三个我们就进行下一步,没有就一直轮询,

问题:

1.我们发现判断的线程如果没达到它的要求,cpu执行到它时就一直空转,白白浪费

2.这个方法还有一个问题,我们没办法保证可见性,也就是说假设当加入元素的线程到达了3个,但是此时元素数量3只是处于工作内存中,那么在它将工作内存中的3刷新到共享内存中的这段时间中可能又加入了新的元素,加入后等待线程取到值,可是这时候已经大于3了,所以程序会出现问题。

3.wait/notify机制

这是一个Object里的方法,两个方法的作用就是沉睡和唤醒,当我们的等待线程发现没有达到想要的条件我们就沉睡它,此时另一个线程来加入元素,当元素数量达到了3 ,我们可以唤醒等待线程,告诉他你的条件达到了,你继续执行吧

问题:如果说添加元素的线程一下添加了3个,进行了唤醒操作,但是等待线程还没运行到wait,这时产生了次空唤醒。当等待线程执行到wait之后沉睡,因为它要依靠添加元素的线程唤醒,但是添加元素的线程已经进行了唤醒,因此会一直沉睡。

4.消息管道:

就是通过一条管道传输线程之间通信的消息。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中的线程间通信(Thread Communication)是为了让多个线程能够协作、同步和共享数据。这是实现并发编程的关键,有助于提高程序的效率和响应性。Java 提供了几种机制来支持线程间通信: 1. **wait() 和 notify() 方法**:这两个方法定义在 `Object` 类中,用于线程的等待-唤醒模式。一个线程调用 `wait()` 方法会释放对象锁并进入等待状态,而持有锁的其他线程可以通过 `notify()` 或 `notifyAll()` 来唤醒等待的线程。 2. **synchronized 关键字**:用于同步代码块或方法,保证在同一时只有一个线程可以访问特定代码段。这对于共享资源的互斥访问至关重要。 3. **BlockingQueue**:Java集合框架中的非阻塞队列,如 `LinkedList`、`ArrayBlockingQueue` 等,允许线程通过队列传递消息或数据。 4. **CountDownLatch** 和 **CyclicBarrier**:前者是一个计数器,当所有等待的线程完成某个任务后才会继续;后者是一个屏障,线程们会在到达屏障点时一起停下来,然后继续执行。 5. **Semaphore**:信号量可以控制同时访问某个资源的线程数量,类似于一个票证系统。 6. **Future 和 Callable**:`Future` 接口用于异步执行任务的结果,`Callable` 提供了一个可以返回结果的线程,结合 `ExecutorService` 可以实现线程的异步通信。 7. **EventListeners** 和 `java.util.Observer`:适用于事件驱动编程模式,当事件发生时通知感兴趣的监听者。 8. **Java Message Service (JMS)**:企业级的消息传递API,用于生产者和消费者之的异步通信。 每个场景选择合适的通信机制能更好地管理并发和避免死锁等问题。如果你需要进一步了解这些内容,或者有具体使用场景的问题,可以提出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值