Netty学习(三)- Unsafe

本文深入剖析了Netty框架中Unsafe接口的作用及其在不同Channel实现类中的具体应用,包括AbstractUnsafe、AbstractEpollUnsafe及EpollServerSocketUnsafe等关键实现。

目录

1.概览

1.1 介绍

2. 分析

2.1 Unsafe接口

 

2.2 Unsafe接口实现类

2.2.1 AbstractUnsafe

2.2.2 AbstractEpollUnsafe

2.2.3 EpollServerSocketUnsafe


1.概览

1.1 介绍

官方解释

Unsafe operations that should never be called from user-code. These methods are only provided to implement the actual transport, and must be invoked from an I/O thread except for the following methods:

这个接口的方法主要用来做实际传输的,并且必须被一个IO线程调用,不能被开发者调用。

2. 分析

2.1 Unsafe接口

    public interface Unsafe {
        Handle recvBufAllocHandle();
 
        SocketAddress localAddress();
 
        SocketAddress remoteAddress();
 
        void register(EventLoop var1, ChannelPromise var2);
 
        void bind(SocketAddress var1, ChannelPromise var2);
 
        void connect(SocketAddress var1, SocketAddress var2, ChannelPromise var3);
 
        void disconnect(ChannelPromise var1);
 
        void close(ChannelPromise var1);
 
        void closeForcibly();
 
        void deregister(ChannelPromise var1);
 
        void beginRead();
 
        void write(Object var1, ChannelPromise var2);
 
        void flush();
 
        ChannelPromise voidPromise();
 
        ChannelOutboundBuffer outboundBuffer();
    }

 

2.2 Unsafe接口实现类

刚才也说到了,Unsafe接口被作为Channel接口的内部接口,那要看Unsafe接口的具体实现就必须到Channel接口的各个实现类去看看。Channel接口的实现类相当多,从idea导出

AbstractChannel (io.netty.channel)
    AbstractEpollChannel (io.netty.channel.epoll)
        AbstractEpollServerChannel (io.netty.channel.epoll)
            EpollServerDomainSocketChannel (io.netty.channel.epoll)
            EpollServerSocketChannel (io.netty.channel.epoll)
        AbstractEpollStreamChannel (io.netty.channel.epoll)
            EpollSocketChannel (io.netty.channel.epoll)
            EpollDomainSocketChannel (io.netty.channel.epoll)
        EpollDatagramChannel (io.netty.channel.epoll)
    LocalChannel (io.netty.channel.local)
    AbstractHttp2StreamChannel (io.netty.handler.codec.http2)
        Http2StreamChannel in Http2MultiplexCodec (io.netty.handler.codec.http2)
    EmbeddedChannel (io.netty.channel.embedded)
    AbstractOioChannel (io.netty.channel.oio)
        AbstractOioByteChannel (io.netty.channel.oio)
            OioByteStreamChannel (io.netty.channel.oio)
                OioSocketChannel (io.netty.channel.socket.oio)
                                    RxtxChannel (io.netty.channel.rxtx)
                            AbstractOioMessageChannel (io.netty.channel.oio)
            OioSctpServerChannel (io.netty.channel.sctp.oio)
                            OioServerSocketChannel (io.netty.channel.socket.oio)
                            OioSctpChannel (io.netty.channel.sctp.oio)
                            OioDatagramChannel (io.netty.channel.socket.oio)
                    AbstractServerChannel (io.netty.channel)
        LocalServerChannel (io.netty.channel.local)
    AbstractNioChannel (io.netty.channel.nio)
        AbstractNioMessageChannel (io.netty.channel.nio)
            NioDatagramChannel (io.netty.channel.socket.nio)
            NioUdtAcceptorChannel (io.netty.channel.udt.nio)
                NioUdtByteAcceptorChannel (io.netty.channel.udt.nio)
                                    NioUdtMessageAcceptorChannel (io.netty.channel.udt.nio)
                                NioSctpChannel (io.netty.channel.sctp.nio)
            NioSctpServerChannel (io.netty.channel.sctp.nio)
            NioServerSocketChannel (io.netty.channel.socket.nio)
            NioUdtMessageConnectorChannel (io.netty.channel.udt.nio)
                NioUdtMessageRendezvousChannel (io.netty.channel.udt.nio)
                            AbstractNioByteChannel (io.netty.channel.nio)
            NioSocketChannel (io.netty.channel.socket.nio)
                            NioUdtByteConnectorChannel (io.netty.channel.udt.nio)
                ServerChannel (io.netty.channel)
    ServerSocketChannel (io.netty.channel.socket)
        EpollServerSocketChannel (io.netty.channel.epoll)
        OioServerSocketChannel (io.netty.channel.socket.oio)
        NioServerSocketChannel (io.netty.channel.socket.nio)
    ServerDomainSocketChannel (io.netty.channel.unix)
        EpollServerDomainSocketChannel (io.netty.channel.epoll)
    AbstractEpollServerChannel (io.netty.channel.epoll)
        EpollServerDomainSocketChannel (io.netty.channel.epoll)
        EpollServerSocketChannel (io.netty.channel.epoll)
    SctpServerChannel (io.netty.channel.sctp)
        OioSctpServerChannel (io.netty.channel.sctp.oio)
        NioSctpServerChannel (io.netty.channel.sctp.nio)
    AbstractServerChannel (io.netty.channel)
        LocalServerChannel (io.netty.channel.local)
    UdtServerChannel (io.netty.channel.udt)
        NioUdtAcceptorChannel (io.netty.channel.udt.nio)
            NioUdtByteAcceptorChannel (io.netty.channel.udt.nio)
            NioUdtMessageAcceptorChannel (io.netty.channel.udt.nio)
SctpChannel (io.netty.channel.sctp)
    NioSctpChannel (io.netty.channel.sctp.nio)
    OioSctpChannel (io.netty.channel.sctp.oio)
UnixChannel (io.netty.channel.unix)
    AbstractEpollChannel (io.netty.channel.epoll)
        AbstractEpollServerChannel (io.netty.channel.epoll)
            EpollServerDomainSocketChannel (io.netty.channel.epoll)
            EpollServerSocketChannel (io.netty.channel.epoll)
        AbstractEpollStreamChannel (io.netty.channel.epoll)
            EpollSocketChannel (io.netty.channel.epoll)
                            EpollDomainSocketChannel (io.netty.channel.epoll)
                        EpollDatagramChannel (io.netty.channel.epoll)
    DomainSocketChannel (io.netty.channel.unix)
        EpollDomainSocketChannel (io.netty.channel.epoll)
    ServerDomainSocketChannel (io.netty.channel.unix)
        EpollServerDomainSocketChannel (io.netty.channel.epoll)
DatagramChannel (io.netty.channel.socket)
    NioDatagramChannel (io.netty.channel.socket.nio)
    OioDatagramChannel (io.netty.channel.socket.oio)
    EpollDatagramChannel (io.netty.channel.epoll)
DuplexChannel (io.netty.channel.socket)
    DomainSocketChannel (io.netty.channel.unix)
        EpollDomainSocketChannel (io.netty.channel.epoll)
    AbstractEpollStreamChannel (io.netty.channel.epoll)
        EpollSocketChannel (io.netty.channel.epoll)
        EpollDomainSocketChannel (io.netty.channel.epoll)
    SocketChannel (io.netty.channel.socket)
        EpollSocketChannel (io.netty.channel.epoll)
        NioSocketChannel (io.netty.channel.socket.nio)
        OioSocketChannel (io.netty.channel.socket.oio)
UdtChannel (io.netty.channel.udt)
    NioUdtByteConnectorChannel (io.netty.channel.udt.nio)
        NioUdtByteRendezvousChannel (io.netty.channel.udt.nio)
    NioUdtMessageConnectorChannel (io.netty.channel.udt.nio)
        NioUdtMessageRendezvousChannel (io.netty.channel.udt.nio)
    UdtServerChannel (io.netty.channel.udt)
        NioUdtAcceptorChannel (io.netty.channel.udt.nio)
            NioUdtByteAcceptorChannel (io.netty.channel.udt.nio)
            NioUdtMessageAcceptorChannel (io.netty.channel.udt.nio)

选几个比较常用的Channel实现类看看对应的Unsafe接口实现。

2.2.1 AbstractUnsafe

AbstractUnsafe抽象类位于AbstractChannel内部。

看下它的方法

2.2.2 AbstractEpollUnsafe

AbstractEpollUnsafe是AbstractUnsafe的子类

2.2.3 EpollServerSocketUnsafe

EpollServerSocketUnsafe是AbstractEpollUnsafe的子类

 

Netty 4.1.92.Final 版本中,使用 `io.netty.util.internal.PlatformDependent0$4` 类调用 `sun.misc.Unsafe::objectFieldOffset` 方法出现终止性弃用警告,这是因为 `sun.misc.Unsafe` 类是内部使用的类,不建议直接使用,并且在未来的 Java 版本中可能会被移除。以下是几种解决该警告的方法: ### 1. 升级 Netty 版本 Netty 团队会不断更新和改进代码,新版本可能已经对 `Unsafe` 的使用进行了优化或替换。可以尝试将 Netty 升级到较新的稳定版本,检查是否还存在该警告。 ### 2. 使用替代方法 如果可能,尽量避免直接使用 `sun.misc.Unsafe` 类。Netty 提供了一些替代的 API 来处理内存操作,例如 `PlatformDependent` 类。可以使用 `PlatformDependent` 类的相关方法来替代 `Unsafe` 的使用。 示例代码: ```java import io.netty.util.internal.PlatformDependent; public class Main { public static void main(String[] args) { // 使用 PlatformDependent 类的相关方法替代 Unsafe // 例如获取对象字段偏移量 long offset = PlatformDependent.objectFieldOffset(SomeClass.class, "someField"); } } class SomeClass { private int someField; } ``` ### 3. 忽略警告 如果无法避免使用 `sun.misc.Unsafe` 类,并且确认代码在当前环境下能够正常工作,可以选择忽略该警告。在 Java 代码中,可以使用 `@SuppressWarnings` 注解来忽略特定的警告。 示例代码: ```java @SuppressWarnings("deprecation") public class Main { public static void main(String[] args) { // 调用 sun.misc.Unsafe::objectFieldOffset 方法 // 这里会忽略终止性弃用警告 } } ``` ### 4. 检查 Java 版本 确保使用的 Java 版本与 Netty 版本兼容。某些 Java 版本可能对 `Unsafe` 类的使用有更严格的限制,尝试更换 Java 版本可能会解决警告问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值