自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(121)
  • 资源 (2)
  • 问答 (7)
  • 收藏
  • 关注

原创 04_HashMap

04_Hashmap一. hashmap的基本原理二. 红黑树三. hashmap源码3.1 put(key, value)三. 疑问3.1 既然红黑树的查询性能比链表高得多,为什么不直接使用红黑树来代替链表呢?一. hashmap的基本原理二. 红黑树https://www.sohu.com/a/335449747_463994三. hashmap源码1.size到底是hashmap中目前存放的元素个数,还是在table上存放的node的个数,不包括链表上挂载的?2.如果hash值相同,那么不

2021-07-15 23:24:49 343 2

原创 08_集合包的fail fast机制

首先说说现象,当我们使用iterator迭代器遍历一个集合的过程中,如果其它线程向这个集合新增或删除了一个key-value,那么当前线程会抛出ConcurrentModificationException异常。然后说说原理。无论是AbstractList,还是HashMap,它们都拥有一个modCount变量,每当我们向集合新增或者删除元素,都会使modCount的值增加1,这个参数就好像集合的版本号。当我们在迭代之前,会创建一个expectedModCount,记录迭代之前的版本号,迭代完毕后,会再

2021-07-06 22:36:23 275

原创 07_HashSet、LinkedHashSet、TreeSet

07_HashSet、LinkedHashSet、TreeSet一. 基本原理和优缺点二. 源码2.1 HashSet add(E e)2.2 HashSet iterator()一. 基本原理和优缺点HashSet的底层是基于HashMap实现的,只不过在插入数据时,key对应的value是一个空对象。后续所有的操作直接针对key来做就可以了。由于hashmap的key是不能重复的,一旦重复,那么在hash寻址时就会找到同一个数组下标,接着因为key的值重复,就会导致新的value覆盖旧value。

2021-07-06 22:10:50 308

原创 06_TreeMap

06_TreeMap一. 基本原理和优缺点二. 源码分析2.1 put(K key, V value)2.2 红黑树节点的结构一. 基本原理和优缺点TreeMap与Hashmap、LinkedHashMap不同,他的底层不再是数组,而是一颗红黑树。在插入、删除或者替换元素时,TreeMap能按照事先约定的顺序来对key进行排序和迭代查询。支持二叉搜索,因此做查询操作时,时间复杂度是O(logn),虽然比起纯粹使用数组要慢O(1),但是比普通的链表要快O(n)。插入数据类似链表,只调整几个指针就实现插入

2021-07-06 00:25:35 311

原创 05_LinkedHashMap

05_LinkedHashMap一. 基本原理和优缺点二. 源码分析2.1 put(K key, V value) 初次插入2.2 put(K key, V value) 覆盖已经存在的key2.3 remove一. 基本原理和优缺点LinkedHashMap能记录你插入元素的顺序,在遍历时,能按照插入的顺序给你遍历出来。LinkedHashMap是HashMap的子类,所以基本的操作与hashmap类似。不过呢,在插入、删除、替换key-value对的时候,LinkedHashMap会维护一个链表结

2021-07-05 23:23:04 372

原创 03_Vector和Stack

03_Vector和Stack一. 基本原理和优缺点二. 源码分析2.1 push2.2 pop三. 总结一. 基本原理和优缺点Stack继承了Vector,Vector底层还是一个List,也就是基于数组来实现的,所以ArrayList有的优点,比如获取元素的速度快,随机读,它都有,与此相对的,ArrayList的缺点,比如从中间插入一个元素,从中间删除一个元素,Stack也存在。但是呢,Stack使用最多的方法就是push和pop,换句话说,Stack的作者并非希望我们把使用ArrayList的那

2021-07-03 13:35:40 599

原创 01_JVM问题汇总

01_JVM问题汇总1. 静态成员变量到底是放在方法区,还是堆中?2. 方法区存放了什么东西?3. 类加载器是按需加载,我现在就想一次性加载所有的类,可不可以?4. 什么是实例变量?5. 一个类经过初始化阶段之后,是不是就产生实例对象了?6. 什么是动态部署,什么是静态部署呢?1. 静态成员变量到底是放在方法区,还是堆中?答: Java虚拟机规范没有规定方法区的实现细节,不同的虚拟机实现的方式不同。对于常见的HotSpot虚拟机而言,在JDK1.7之前,静态成员变量存放在方法区,而在JDK1.7以及之后

2021-07-02 17:46:14 102

原创 02_LinkedList

02_LinkedList一. 基本原理和优缺点二. 源码分析2.1 add2.2 node2.3 add(int index, E element)2.4 get2.5 getFirst2.6 peek2.7 getLast2.8 removeLast2.9 removeFirst2.10 remove(int index)三. 总结一. 基本原理和优缺点优点:1.底层基于双向链表,往LinkedList中间插入元素时,不需要移动大量的元素,只需要修改前后节点的指针,速度快。2.适合频繁、大量的插

2021-07-02 00:14:58 137 1

原创 01_ArrayList

01_ArrayList一. 基本原理和优缺点二. 源码分析1.1 默认的构造函数1.2 add(E e)1.3 add(int index, E element)1.4 set(int index, E element)1.5 get(E element)1.6 remove(int index)三. 结论一. 基本原理和优缺点优点:1.通过下标读取元素的速度很快,这是因为ArrayList底层基于数组实现,可以根据下标快速的找到内存地址,接着读取内存地址中存放的数据。2.随机读的性能很高,仍然是

2021-07-01 08:31:36 156

原创 01_如何保证创建订单接口的幂等性?

几乎所有人都有过网购的经历,我们会打开电商网页,浏览商品,添加至购物车,接着选中几款本次需要购买的商品,提交订单。服务端接收到请求后,会为本次用户操作,创建一份独一无二的订单。上述过程看起来非常美好,但实际上很可能出现各种问题。比如,用户在点击提交订单时,由于网络原因,导致请求没有正常的发送到服务端,通常在这个时候,用户会反复的点击提交订单按钮,直到服务端回复。这就造成了多次调用了创建订单的接口。再比如,后端使用了网关服务,用户通过前端把请求发送至网关,由网关把请求转发到订单服务,在网络卡顿的情况下,由

2021-06-30 11:12:07 1113 1

原创 02_zookeeper分布式锁源码分析

02_zookeeper分布式锁源码分析一. 可重入的公平锁1.1 基本的使用方式1.2 初次加锁1.3 同客户端、同线程,重入加锁的过程1.4 加锁时的锁互斥1.5 释放锁1.6 疑问1.6.1 同一个InterProcessMutex对象是否支持多个线程使用?二. Semaphore信号量2.1 基本的使用方式2.2 获取信号量三. 不可重入的公平锁3.1 基本的使用方式3.2 初次加锁3.2 再次加锁(重入锁)四. 可重入的读写锁4.1 基本的使用方式五. MultiLock一. 可重入的公平锁1

2021-06-28 11:21:53 313 2

原创 01_redisson分布式锁源码分析

01_redisson分布式锁源码分析一. 可重入锁1.1 重要参数1.1.1 加锁的时间(leasetime)1.2 分析源码1.2.1 初次加锁的过程1.2.2 Watch Dog定时检查和延长锁的有效期1.3 疑问1.3.1 Watch Dog间隔多久进行一次检查?如果发现锁仍然被持有,每次续约多长的有效期?1.3.2 为什么成功获得锁的客户端,获取到的锁的有效时长是0呢?二. 待解决的疑问一. 可重入锁1.1 重要参数1.1.1 加锁的时间(leasetime)某些方法执行非常耗时,如果超过

2021-06-26 15:38:05 372

原创 Java基础: CPU缓存行、无效化队列

Java基础: CPU缓存行、无效化队列一. 什么是缓存行?二. 什么是CUP的三级缓存?三. CPU核心、缓存行、消息总线、内存是如何交互的呢?四. 多核CPU更新数据时面临的脏数据问题五. 解决多核CPU更新时面临的脏数据问题(MESI)一. 什么是缓存行?答: 缓存行是CPU与内存之间的一块临时数据交换器,用于解决CPU运算速度与内存读写速度不匹配的矛盾。二. 什么是CUP的三级缓存?CPU的缓存被分成了三个级别: L1,L2,L3,其中,越接近CPU的缓存容量越小,但运行速度越接近CPU。

2021-06-25 23:33:42 996 2

原创 07_ByteTCC源码分析 0.4.x版本

07_ByteTCC源码分析 0.4.x版本一. 说明二. ByteTCC启动时做了哪些事情?三. 接收到外部请求后,主业务服务是如何向从业务服务发起try请求的?3.1 ByteTCC框架提供的CompensableHandlerInterceptor preHandle( )3.2 ByteTCC框架提供的CompensableMethodInterceptor invoke()3.3 spring-tx提供的TransactionInterceptor invoke( )4. ByteTCC框架提供

2021-06-14 20:50:19 660 2

原创 06_TCC分布式事务

一. 常用的TCC技术方案1.1 通用型TCC技术方案适用于大多数场景,主要由以下三个组件构成:主业务服务它调用了其它从业务服务的方法,有着分布式事务的需求,负责整个分布式事务的编排、管理、执行以及回滚操作。从业务服务对外提供接口,实现自己的业务功能,供主有任务服务调用。从业务服务至少要实现三个接口:try接口、confirm接口、cancel接口。业务活动管理器负责记录分布式事务中,各个从业务服务的事务状态,以及向从业务服务发起confirm、cancel等调用请求。通用型的TCC技

2021-06-13 10:30:53 284 2

原创 05_CAP与BASE原理

05_CAP与BASE原理一. CAP原理1.1 一致性1.2 可用性1.3 分区容忍性1.4 CAP的各种组合二. BASE理论一. CAP原理1.1 一致性C,#就是Consistency。客户端向分布式系统请求处理数据,分布式系统响应SUCCESS后,客户端查询数据时,能查看到最新的数据。什么是一致性?当客户端接收到SUCCESS后,再次请求分布式系统,能获取到最新的,被修改的数据信息,这就是一致性。什么是不一致?A:假如客户端明明接受到了SUCCESS,由于服务A-节点1没

2021-06-11 22:44:39 237

原创 04_基于JTA+Druid多数据源+Atomikos实现单实例多数据源的事务控制

04_基于JTA+Druid多数据源+Atomikos实现分布式事务一. JTA+Druid+Atomickos的使用方式1.1 引入依赖1.2 增加配置1.3 druid数据源配置1.4 增加事务注解二. JTA+Atomikos分布式事务的源码分析2.1 创建分布式事务2.2 创建Datasource和Connection2.3 发送XA START2.4 发送XA END指令一. JTA+Druid+Atomickos的使用方式1.1 引入依赖<dependency> <gr

2021-06-06 22:05:49 1252 3

原创 03_XA规范和2PC分布式事务

03_XA规范和2PC分布式事务一. 为什么要引入XA规范、2PC分布式事务等概念?二. XA规范是什么?三. 2PC理论是什么?四. 2PC理论的缺陷是什么?五. 3PC理论是什么?六. 模拟实现Mysql XA分布式事务一. 为什么要引入XA规范、2PC分布式事务等概念?假设我们开发了一个应用,起初只接入了一个数据库,系统运行的很好,但随着系统流量增大、需要存储的数据量增多,我们不得不进行分库分表。应用内,某些方法可能需要同时请求多个数据库。@Transactionalpublic void

2021-06-05 23:36:12 318

原创 02_Spring事务框架源码

Spring事务框架源码一. 粗略分析@Transactional二. 探究Spring-tx.jar一. 粗略分析@Transactional假设现在有如下案例。public class ServiceA { @Autowired private class ServiceB serviceB; public void test() { serviceB.method(); }}public class ServiceB { @Transactional(rollback =

2021-06-05 16:46:04 194 1

原创 01_事务基础知识

事务基础知识一. 事务的ACID二. 事务的隔离级别2.1 读,未提交(READ UNCOMMITTED)2.2 读,已提交(READ COMMITTED)2.3 可重复读(REPEATABLE READ)2.4 幻读一. 事务的ACIDAtomic: 原子性一组SQL放在一起执行,要么全部执行成功,要么就都别执行,不存在部分执行成功的状态。(关注的是数据的状态)Consistency: 一致性在事务的执行过程中,中间状态的数据对外不可见,只有最初和最终的状态对外可见。(关注的是数据的可见性)

2021-06-03 21:46:27 211 2

原创 F5指标与oid的对应关系

指标中文名 指标英文名 oid 电源状态 sysChassisPowerSupplyStatus 1.3.6.1.4.1.3375.2.1.3.2.2.2.1.2 电源风扇状态 sysChassisFanStatus 1.3.6.1.4.1.3375.2.1.3.2.1.2.1.2 接口流量状态 sysInterfaceFlowCtrlReq 1.3.6.1.4.1.3375.2.1.2.4.1.2.1.10 接口IP信息 sysSelf

2020-12-02 14:01:45 1275 3

原创 JVM理论和实战知识-学习笔记

JVM-系统性学习一. JVM从编译到执行的粗略过程1.1 概念1.2 问题二. JVM的类加载机制到底是怎么样的?2.1 JVM一般在什么时候会去加载一个类?2.2 看看验证、准备和初始化的过程2.2.1 验证阶段2.2.2 准备阶段2.2.3 解析阶段2.2.4 初始化 (核心阶段)2.2.5 类加载器和双亲委派机制2.2.6 本章的问题蓝色为待补充的内容红色为需要突出的重点绿色为面试时可能遇到的问题一. JVM从编译到执行的粗略过程1.1 概念一旦你执行’java’命令,实际上此时就会启

2020-11-30 19:22:46 267 1

原创 Mac系统Pycharm本地安装pymqi 访问ibm websphere mq

一. 基础环境python: 2.7pymqi: 1.12.0ibm websphere mq: 7.5二. 安装过程我们的目的是在Pycharm中开发python脚本,本地依赖pymqi,访问远程的ibm websphere mq。在安装pymqi之前,我们必须下载IBM MQ 依赖库,因为pymqi依赖这些依赖库。2.1 安装IBM MQ工具箱下载地址:9.2.0.0-IBM-MQ-Toolkit-MacX64.tar.gz [IBM MQ工具箱 MAC版本]解压缩.

2020-10-30 17:04:28 807

原创 Redis 哨兵模式下,Master节点宕机后,进行故障转移的过程

有三台服务器S1:192.168.50.121S2:192.168.50.122S3:192.168.50.123其中S1、S2上部署了Redis服务和Redis sentinel,S3上只部署了Redis sentinel。假设S1是Master,突然宕机,在经过一段时间后(down_after_milliseconds),可以看到控制台输出如下语句:1.+sdown master mymaster 192.168.50.121 6379当前哨兵认为master已经主..

2020-09-13 21:23:54 5606

原创 ThreadPoolExecutor关闭线程池的原理

知识储备 - 线程池的5种状态1. RUNNING状态说明: 线程池处于RUNNING状态时,能够接收新的任务,并对已经接收的任务进行处理。状态切换: 线程池一旦被创建,就处于RUNNING状态,并且线程池中的任务数量为0。2. SHUTDOWN状态说明: 线程池处于SHUTDOWN状态时,不能接收新的任务,但能对已经接收的任务进行处理。状态切换: 调用线程池的shutdown()方法后,线程池的状态RUNNING -> SHUTDOWN3. STOP状态说明: 线

2020-09-07 18:30:04 2644

转载 centos安装gcc的方法

我自己的操作系统是CentOS6.5,通过下载对应版本的tar包、执行./contrib/download_prerequisites等操作,不管怎样都装不上高版本的gcc,但是使用下面的方法成功的装上了7.3.1版本的gcc。转载自:https://www.vpser.net/manage/centos-6-upgrade-gcc.htmlCentOS 7虽然已经出了很多年了,但依然会有很多人选择安装CentOS 6,CentOS 6有些依赖包和软件都比较老旧,如今天的主角gcc编译器,Cent.

2020-08-23 00:19:58 2611

原创 Java基础: 手动创建线程池

使用ExecutorServices直接创建线程池的缺点:1. FixedThreadPool或者SingleThreadPool 允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。2.CachedThreadPool 允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。生产环境的做法:1. 创建线程工厂,指定创建线程时的线程名称的命名规律ThreadFactory nameThr...

2020-08-17 12:02:16 1779

原创 为什么StringBuilder线程不安全,但StringBuffer线程安全?

StringBuilder和StringBuffer都继承了AbstractStringBuilder,AbstractStringBuilder内有两个非常重要的变量,分别是:// 用于存储字符的容器char[] value; // 已存储的字符数量int count; 注意,value没有加上final,也就是说,它是可变的,这点与String不同。StringBuilder与StringBuffer自身的append()方法内都使用了继承自AbstractStringBuilde

2020-08-16 22:51:47 3419

原创 Mysql主从复制

Mysql主从复制 一. 为什么要做主从复制二. 主从复制过程相关概念2.1 binlog文件一. 为什么要做主从复制确保数据安全让其它服务器成为主服务器的数据热备。当主服务器故障后,可以迅速的将从服务器切换成主服务器,不仅可以尽可能地保证数据不丢失,而且可以快速的恢复整套数据库系统,对外持续提供服务。实现读写分离读写分离的好处不仅在于请求压力分流、降低单台服务器的磁盘的IO访问频率,还在于写请求导致锁行或锁表后,读请求能正常对外提供服务。二. 主从复制过程相关概念2.1 binl

2020-08-16 16:33:59 103

原创 分布式环境下,分库分表后的如何生成全局唯一的主键id?

一. 问题分库分表后,多个数据库存在相同的数据表,那么在插入数据时,主键id如何保证唯一呢?二. 解决方案1. 新增一台专门用于创建id的数据库全局范围内新增一台数据库,专门用于创建和提供主键id。其它数据库表在插入数据之前,首先向这台数据库插入一台数据,通过主键自增的方式,获得一个id,接着再插入到自己的数据表内。缺点:1.需要额外创建数据库实例。2.由于所有涉及到创建主键id的写请求操作都需要经过这台数据库,因此请求压力较高,无法满足大并发的场景。适用场景:写请求并发小,写入数据

2020-08-11 17:40:56 801

原创 Mysql Innodb的实现

一. 数据准备有一张用户信息表(account),有id、用户名(username)、年龄(age) 三个字段。以id作为主键,创建主键索引。以username创建普通索引。二. Innodb的实现1. 主索引树Innodb使用B+树作为索引结构,主索引树的特点是数据文件和主索引存放在一起。如图所示,主索引树的叶子节点中不仅包含主键(id),还包含了完整的数据文件(username、age),这种索引被称作"聚集索引"。由于数据需要依靠主键才能找到存储的位置,因此

2020-08-09 23:05:55 242

原创 数据库分库分表扩缩容方案

一. 为什么在分库分表的场景下需要扩容需要为数据库集群考虑扩容的原因一般有如下两点:1. 数据库所在服务器的磁盘空间不足。(当然也可以加磁盘)2. 读写请求并发量超过了数据库集群能承载的极限。二. 如何扩容首次进行数据库规划时,尽可能地考虑极限情况。起初可能租用地服务器数量较少,但是我们可以在每一台服务器上部署尽可能多地数据库实例,这点是方便后期扩容的关键。举个例子,比如刚开始我们只租用了4台服务器,但每台服务器上部署了8个数据库实例和32张数据表。假如使用Mysql数据库,

2020-08-09 21:11:49 1079

原创 线上运行的系统实现从单库单表迁移至分库分表的实现方案

一. 需要长时间停机的迁移方案迁移过程:1. 将业务服务停机(比如使用Tomcat容器,不在对外提供服务)2. 启动多个分库分表服务,从单库单表的DB中抽取数据,并发送至数据库分库分表中间件,接着由中间件将数据写入到分库分表的DB中。这个过程所耗费的时间与数据量、分库分表服务的个数、是否使用多线程等因素相关。3. 通过修改配置的方式,断开业务服务与单库单表DB的连接,使业务服务连接到数据库分库分表中间件上,并重启业务服务。缺点:整套迁移流程需要一气呵成,当单库单表的数据量较大时,

2020-08-09 18:58:37 889 2

原创 分布式锁 & 面试题

分布式锁一. Zookeeper1.1 zk有哪些使用场景?一. Zookeeper1.1 zk有哪些使用场景?

2020-07-31 15:53:58 4447 2

原创 Elasticsearch from+size与scroll混合使用实现深度分页搜索

目录一. 需求二. 思考三. 实现方案一. 需求环境准备: JDK1.8 Elasticsearch7.3.1 RestHighLevelClient客户端对Elasticsearch做深度分页,比如第1500页,每页20条记录,且需要支持前后翻页。二. 思考由于index.max_result_window的限制,直接使用from+size无法搜索满足条件10000条以上的记录。如果贸然增大index.max_result_window值,那么你怎么知道系统未来会在索引内存多少条数据?就算这一次

2020-07-29 16:53:37 1426

原创 Elasticsearch 搜索数量不能超过10000的解决方案

目录一. 问题描述二. 问题分析三. 解决方案3.1 调大index.max_result_window(不推荐)3.2 cardinality(不推荐)3.3 track_total_hits(推荐)一. 问题描述开发环境: JDK1.8、Elasticsearch7.3.1、RestHighLevelClient问题: 最近在通过Java客户端操作ES进行分页查询(from+size)时,需要返回满足条件的数据总数。我发现满足条件的数据总数一旦超过10000条,使用SearchResponse的g

2020-07-29 14:51:52 10913 2

原创 分布式系统 & 面试题

目录一. 前言二. 分布式基础问题一. 前言本文是我学习石杉老师所讲的Java面试突击课程时所做的笔记。二. 分布式基础问题为什么要将系统进行拆分?不易维护(项目太重)记得刚刚参加工作时,第一次接触到的大型产品是公司购买的蓝凌OA系统,这套产品涵盖了日常办公使用的申请、审批工作流、报表、后台管理以及门户等等功能。整个产品通过几十万行代码支撑,不仅有后端、还包含了前端代码以及各种脚本、模板文件,由于项目巨大,报错后不容易定位错误位置,而且每次希望定制某项功能时,非常担心修改后,牵一发而动全身

2020-07-24 16:27:57 3023

原创 Redis进阶篇(高并发与高性能) & 面试题

Redis进阶篇一. Redis与系统高并发之间的关系二. Redis单机的瓶颈三. Redis如何支撑超过10万QPS的并发量四. Redis replication核心机制一. Redis与系统高并发之间的关系想要设计一套能承载数十万甚至上百万QPS的系统,光凭Redis是远远不够的,Redis只不过是支撑高并发的大型缓存架构中的一个非常重要的环节。比如系统底层的缓存中间件使用Redis,再加上良好的缓存架构设计(多级缓存架构,热点缓存等)的共同作用下,才能支撑数十万甚至上百万的高并发。二. Re

2020-07-21 15:14:42 1924

原创 Git 将一个分支完全覆盖(不是合并)到另一个分支

案例: 将dev分支的代码完全覆盖到master上。git checkout mastergit reset --hard devgit push origin master --force若被覆盖的分支有处于受保护(protected)的状态,则执行push操作后会报错:remote: GitLab: You are not allowed to force push code to a protected branch on this project.To https://git.

2020-06-03 17:23:41 5215

原创 Java应用:图片叠加

图片叠加一. 功能目标二. 代码实现2.1 依赖2.2 图片叠加服务一. 功能目标现有一张背景图片,一张水印图片,希望将水印图片叠加到背景图片上方的指定位置。本代码基于Spring boot框架搭建而成,外部发起请求,可以下载到合成后的图片。注意:合成图片的难点不在代码,而在寻找素材。底图和水印图片的尺寸一定要固定。只有不断地调试水印图片在底图上的坐标,才能使得合成后的图片更加自然。如有必要,可以适当的缩放图片。背景图片:水印图片:希望实现的效果:二. 代码实现2.1

2020-06-01 10:53:31 1395 4

frp_0.13.0_windows_amd64 -- 亲测可用

此软件用于内网穿透,其中frpc.exe用于客户端,frps.exe用于服务端。 注意: FRP的客户端和服务端版本一定要一致!!!

2019-04-21

XManager5(附上注册码、注册机) --- 亲测可用

XManager是可以浏览远端X窗口系统的工具,运行在Windows平台的X Server软件,远程把Unix/Linux的桌面无缝地带到Windows桌面上。

2019-04-21

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除