Java同步阻塞怎么实现

发布时间:2021-12-31 09:22:22 作者:iii
来源:亿速云 阅读:220

本篇内容介绍了“Java同步阻塞怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一:分布式架构网络通信

在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技 术,例如:RMI、Hessian、SOAP、ESB和JMS等

1.1:基本原理

要实现网络机器间的通讯,需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络IO来实现。

1.2:RPC

RPC全称为remote procedure call,即远程过程调用。借助RPC可以做到像本地调用一样调用远程服务,是一种进程间的通信方式。常见的RPC框架有:Hessian、gRPC、Thrift、HSF、Dubbo等。

注意:需要注意的是RPC并不是一个具体的技术,而是指整个网络远程调用过程;对 于RPC框架而言,核心模块就是通讯序列化

远程过程调用分为两种,现在在服务间通信的方式也基本以这两种为主:

1.2.1 RPC架构

一个完整的RPC架构里面包含了四个核心的组件,分别是Client,Client Stub,Server以及Server Stub,这个Stub 可以理解为存根。

Java同步阻塞怎么实现

1.2.2 RPC调用过程

Java同步阻塞怎么实现

注意:无论是何种类型的数据,最终都需要转换成二进制流在网络上进行传输,数据的发送方需要将对象转换为二进制流(序列化),而数据的接收方则需要把二进制流再恢复为对象(反序列化)

1.3:RMI

Java RMI 指的是远程方法调用 (Remote Method Invocation),是java原生支持的远程调用 ,采用JRMP(Java Remote Messageing protocol)作为通信协议,可以认为是纯java版本的分布式远程调用解决方案, RMI主要用 于不同虚拟机之间的通信,这些虚拟机可以在不同的主机上、也可以在同一个主机上,因此这里的通信可以理解为一个 虚拟机上的对象调用另一个虚拟机上对象的方法。

1.3.1 RMI简介

注册表:
注册表(Registry):以URL形式注册远程对象,并向客户端回复对远程对象的引用。

客户端:

  1. 存根/桩(Stub):远程对象在客户端上的代理;

  2. 远程引用层(Remote Reference Layer):解析并执行远程引用协议;

  3. 传输层(Transport):发送调用、传递远程方法参数、接收远程方法执行结果。

服务端:

  1. 骨架(Skeleton):读取客户端传递的方法参数,调用服务器方的实际对象方法,并接收方法执行后的返回值;

  2. 远程引用层(Remote Reference Layer):处理远程引用后向骨架发送远程方法调用;

  3. 传输层(Transport):监听客户端的入站连接,接收并转发调用到远程引用层。

1.3.2 RMI调用过程

Java同步阻塞怎么实现

远程调用过程:
1)客户端从远程服务器的注册表中查询并获取远程对象引用。
2)桩对象与远程对象具有相同的接口和方法列表,当客户端调用远程对象时,实际上是由相应的桩对象代理完成的。
3 ) 远程引用层在将桩的本地引用转换为服务器上对象的远程引用后,再将调用传递给传输层(Transport),由传输层通 过TCP协议发送调用;
4)在服务器端,传输层监听入站连接,它一旦接收到客户端远程调用后,就将这个引用转发给其上层的远程引用层;
5)服务器端的远程引用层将客户端发送的远程应用转换为本地虚拟机的引用后,再将请求传递给骨架(Skeleton);
6)骨架读取参数,又将请求传递给服务器,最后由服务器进行实际的方法调用。

1.4:BIO、NIO、AIO

BIO:同步阻塞的;NIO:同步非阻塞的;AIO:异步非阻塞的。

同步与异步(针对应用程序与内核的交互):

阻塞与非阻塞(针对进程访问数据(读写操作)的时候,根据IO操作的就绪状态采取不同的方式):

1.4.1 BIO(同步阻塞)

BIO:同步阻塞IO,B代表blocking。服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

Java同步阻塞怎么实现

简单实现:

  1. 服务端代码

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket();
        serverSocket.bind(new InetSocketAddress("127.0.0.1",8888));
        while (true){
            // 同步阻塞
            Socket socket = serverSocket.accept();
            new Thread(()->{
                try {
                    byte[] bytes = new byte[1024];
                    int len = socket.getInputStream().read(bytes);
                    System.out.println(new String(bytes,0,len));
                    socket.getOutputStream().write(bytes,0,len);
                    socket.getOutputStream().flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
  1. 客户端代码

    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",8888);
        socket.getOutputStream().write("hello".getBytes());
        socket.getOutputStream().flush();
        System.out.println("server send back data =====");
        byte[] bytes = new byte[1024];
        int len = socket.getInputStream().read(bytes);
        System.out.println(new String(bytes,0,len));
    }

1.4.2 NIO(同步非阻塞)

同步非阻塞IO (non-blocking IO / new io)。服务器实现模式为一个请求对应一个通道(Channel),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。

Java同步阻塞怎么实现

NIO的特点

Java同步阻塞怎么实现

当一个连接创建后,不会需要对应一个线程,这个连接会被注册到多路复用器,所有的连接只需要一个线程就可以操作,该线程的多路复用器会轮询,发现连接有请求时,才开启一个线程处理。

Java同步阻塞怎么实现

NIO模型中selector的作用,一条连接来了之后,现在不创建一个while死循环去监听是否有数据可读了,而是直接把这条连接注册到selector上,然后,通过检查这个selector,就可以批量监测出有数据可读的连接,进而读取数据,

NIO的使用

nio的使用示例

1.4.3 AIO(异步非阻塞)

异步非阻塞IO。A代表asynchronize

特点:

Java同步阻塞怎么实现

使用场景: 连接数目多且连接比较长(重操作)的架构,比如相册服务器。重点调用了OS参与并发操作,Java7开始支持。

“Java同步阻塞怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

推荐阅读:
  1. java 中同步、异步、阻塞和非阻塞区别详解
  2. java 同步、异步、阻塞和非阻塞分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:怎么在SAP Cloud for Customer页面嵌入自定义UI

下一篇:SAP C4C里没有选择Port binding的url Mashup行为的示例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》