专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

java线程间如何通信_java

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/3/5 16:43:08       共计:3588 浏览

java线程间如何通信?

题主问题太宽泛,这个话题可以写一本书,比如《JAVA并发编程实践》,甚至一本书也不够。限于篇幅,我从线程的任务抽象,线程的实际形态这两个角度大概说一下。

任务抽象

线程是对CPU资源的抽象,可以把它映射为一项可执行的任务。从操作系统的多道程序设计到多线程设计,实际上是对多任务模型的发展,不断地简化建模设计难度和充分利用CPU资源。

任务需要操作资源,抽象起来主要包含内存数据和来自各种IO设备的数据。

不同的任务之间需要协作:对任务执行时序的控制,对资源访问的同步,任务之间的通信等。

线程通信

线程在运行时主要可看做一个指令执行序列和相关内存信息(内核态和用户态,包含堆栈、TLS,内核对象,以及运行时设计的关联对象)。

如果两个线程位于相同进程,就和进程间通信IPC等价。

我一般从信息交换和操作同步两个方面来看线程通信。

一、信息交换,本质上就是两个线程可以通过一个公共区域进行消息交换。这个公共区域对应的原始资源包括寄存器,内存,各种IO设备等。

用Java做开发时,进程内两个线程可以直接使用可公共可访问对象进行信息交换。不同进程时,和IPC机制一样,共享内存,文件系统,管道,网络协议实现组件等等,对应的都有最基本的类库实现。

二、操作同步

同步的关键是锁,而锁的核心是原子性,死锁是最主要的问题。

Java中可用的锁包含以下几种:

首先,是CAS接口,在java.util.concurrent.atomic包下面。这个非常重要,你要实现非阻塞锁,这个要应用自如,无锁模式也是处理高并发最理想的方式。这块功能本质上是由CPU提供的基本类型的原子操作。下面的Monitor的无锁模式也是用CAS实现的。

其次,是虚拟机封装的Monitor机制利用对象锁实现互斥和协作,你用synchronized修饰实例方法、静态方法、代码块,或者调用object的wait、notify,notifyall时,都在用虚拟机提供的ObjectMonitor功能,落脚点在操作系统提供的信号量等功能,只要涉及到系统调用使用到内核对象,锁就变重了。关注性能的话可以尝试深入理解它在无锁状态、偏向锁、轻量级锁和重量级锁之间的升降级处理。

最后,就是大量模式设计(比如生产者消费者队列)和常用数据结构同步化,主要提供编程便利。重点可以看看AbstractQueuedSynchronizer类的实现,核心的地方是最终通过Thread.interrupt的synchronized标记落脚到ObjectMonitor。 Semaphore、ReentrantLock的实现也是基于它,官方Api文档还给了一个基于AbstractQueuedSynchronizer实现一个的例子

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:encoder采用什么编码_java | ·下一条:JMCCAPK是什么手机软件_java

Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有