我说我懂多线程,面试官立马给我发了offer

五面阿里,终拿offer,就是不明白为什么面试官总喜欢问这种问题 本文转载自:五面阿里,终拿offer,就是不明白为什么面试官总喜欢问这种问题 一面 一面就做了一道算法题,要求两小时内完成,给了长度为N的有重复元素的数组,要求输出第10大的数。典型的TopK问题,快排算法搞定。 算法题要注意的是合法性校验、边界条件以及异常的处理。另外,如果要写测试用例,一定要保证测试覆盖场景尽可能全。加上平时刷刷算法题,这种考核应该没问题的。 二面 自我介绍下呗 开源项目贡... 阅读详情
AI摘要

本文深入探讨Java多线程的运用与重要性,讲解多线程如何提高资源利用率,分析多线程在实际项目中的应用案例,如线程池、轮询及线程安全的实现。

前言

只有光头才能变强。

文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y

在上周总结了一篇「工作中常用到的Java集合类」,反响还不错。这周来写写Java另一个重要的知识点:「多线程」

多线程大家在初学的时候,对这个知识点应该有不少的疑惑的。我认为主要原因有两个:

  • 多线程在初学的时候不太好学,并且一般写项目的时候也很少用得上(至少在初学阶段时写的项目基本不需要自己创建线程)。
  • 多线程的知识点在面试经常考,多线程所涉及的知识点非常多,难度也不低。

这就会给人带来一种感觉「这破玩意涉及的东西是真的广,平时也不怎么用,怎么面试就偏偏爱问这个鬼东西」

不多BB,我要开始了。

为什么使用多线程?

首先,我们要明确的是「为什么要使用多线程」,可能有人会认为「使用多线程就是为了加快程序运行的速度啊」。如果你是这样回答了,那面试官可能会问你「那多线程是怎么加快程序运行速度的?」

于我的理解:使用多线程最主要的原因是提高系统的资源利用率。

现在CPU基本都是多核的,如果你只用单线程,那就是只用到了一个核心,其他的核心就相当于空闲在那里了。

厕所的坑位有5个,如果只用一个坑位,那不是很亏?比如现在我有5个人要上厕所。

在单线程的时候:进去一个人解决要10分钟,然后后面的人都得等一个坑位。那总的时间就要花费50分钟。

在多线程的时候,进去一个人要解决10分钟,然后后面的人发现还有别的坑位,就去别的坑位了,不是傻瓜地等一个坑位。

我们可以把「等坑位」看作是IO操作,众所周知IO操作相对于CPU而言是非常慢的,CPU等待IO那段时间是空闲的。如果我们需要做类似IO这种慢的操作,可以开多个线程出来,尽量不要让CPU空闲下来,提高系统的资源利用率。

说白了,我们就是在**「压榨」**CPU的资源。本来就有的资源,如果有需要,我们就应当好好利用。

多线程不是银弹,并不是说线程越多,我们的资源利用效率就越好。执行IO操作我们线程可以适当多一点,因为很多时候CPU是相对空闲的。如果是计算型的操作,本来CPU就不空闲了,还开很多的线程就不对了(有多线程就会有线程切换的问题,线程切换都是需要耗费资源的)

多线程离我们远吗?

多线程其实离我们很近,只是很多时候我们感知不到它的存在而已。

Tomcat我相信每个Java后端的同学都认识它,它就是以多线程去响应请求的,我们可以在server.xml中配置连接池的配置,比如:

<Connector port="8080" maxThreads="350" maxHttpHeaderSize="8192" minSpareThreads="45" maxPostSize="512000" protocol="HTTP/1.1" enableLookups="false" redirectPort="8443" acceptCount="200" keepAliveTimeout="15000" maxKeepAliveRequests="-1" maxConnections="25000" connectionTimeout="15000" disableUploadTimeout="false" useBodyEncodingForURI="true" URIEncoding="UTF-8" />

Tomcat处理每一个请求都会从线程连接池里边用一个线程去处理,这显然是多线程的操作。然后这个请求线程顺藤摸瓜到了我们的Servlet,执行对应的service()方法。

而我们的service方法是无状态的,多个线程请求service方法,往往都没有操作共享变量,不操作共享变量就不会有线程安全问题。

上面只是用了Servlet举例,我们常用的SpringMVC其实也是一样的(毕竟底层还是Servlet)。

还有我们在连接数据库的时候,也会用对应的连接池(Druid、C3P0、DBCP等),比如常见的Druid配置:

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
     <property name="url" value="${jdbc_url}" />
     <property name="username" value="${jdbc_user}" />
     <property name="password" value="${jdbc_password}" />

     <property name="filters" value="stat" />

     <property name="maxActive" value="20" />
     <property name="initialSize" value="1" />
     <property name="maxWait" value="60000" />
     <property name="minIdle" value="1" />

     <property name="timeBetweenEvictionRunsMillis" value="60000" />
     <property name="minEvictableIdleTimeMillis" value="300000" />

     <property name="testWhileIdle" value="true" />
     <property name="testOnBorrow" value="false" />
     <property name="testOnReturn" value="false" />

     <property name="poolPreparedStatements" value="true" />
     <property name="maxOpenPreparedStatements" value="20" />

     <property name="asyncInit" value="true" />
 </bean>

我想说的是:我们日常开发的程序几乎都是多线程模式的,只是绝大多数时候我们没感知到而已。很多时候都是框架帮我们屏蔽掉了。

多线程知识重要吗?

从上面总结下来,我们可以发现:我们日常「关于多线程的代码」写得不多,但是我们写的程序代码的的确确是在多线程的环境下跑的。

如果我们不懂多线程知识,很直接的一个现实:

生成结果

从文章最开头的思维导图,我们可以发现多线程的知识点还是很多的,我们起码得知道:

  • 线程和进程的区别
  • Thead类的常见方法
  • 可以用什么手段来解决线程安全性问题
  • Synchronized和Lock锁的区别
  • 什么是AQS、ReentrantLock和ReentrantReadWriteLock锁
  • JDK自带的线程池有哪几个,线程池的构造方法重要的参数
  • 什么是死锁,怎么避免死锁
  • CountDownLatch、CyclicBarrier、Semaphore是什么?
  • Atomic包下的常见子类,什么是CAS,CAS会有什么问题
  • ThreadLocal是什么?
  • …//

虽然在工作中未必会全部用得上,但如果项目真的用到了,我们如果学过了可能就可以很快地理解当时为什么要这样设计(我觉得去挖掘过程还是挺有意思的)。

「我可能不用,但你必须要有」

这个道理也很容易懂:「我买电脑的时候,虽然我是木耳听不出什么音质出来,但你音质就是得好」。企业招人的时候也一样「你在工作的时候未必要写,但你必须要会」

至少在我看来,从求职的角度触发,多线程是很重要的。之前我还整理过在我当时校招经常被问到的多线程面试题目:

  1. 多线程了解多少啊?使用多线程会有什么问题?你是怎么理解“线程安全”的?
  2. 如果我现在想要某个操作等待线程结束之后才执行,有什么方法可以实现?为什么要用CountDownLatch?CountDownLatch的底层是什么?(引出AQS)
  3. synchronized关键字来说一下,它的用途是什么?synchronized底层的原理是什么?
  4. 线程安全的容器有哪些?(着重于ConcurrentHashMap、CopyWriteOnArrayList与其他非线程安全容器的区别以及它们的具体实现)
  5. ThreadLocal你了解过吗?主要是用来干什么的?具体的源码实现原理来说一下吧
  6. 产生死锁的条件是什么?我们可以如何避免死锁?(可延伸到操作系统层面上的死锁)
  7. synchronized锁和ReentrantLock锁有什么区别呀?
  8. 线程池你应该也看过吧,来说说为什么要用线程池。JDK默认实现了几个线程池,分别有xxx(自然地ThreadPoolExecutor构造函数的常用几个参数你也得一起说出来)
  9. …

我在工作中用到的线程知识有哪些

本来是打算这篇文章主旋律就写这块的,然后我翻了一下自己维护的系统,用到的线程的地方还真的不是很多…

我就拿我现在的系统用到线程相关知识的几个例子吧。

线程池

我这边有个调度系统,运营设置了对应的时间,该任务就去执行,执行的内容大致就是去读HDFS文件,然后将数据组装,再传递到下游。

任务触发了以后,我们直接将这个任务交给一个线程池去处理,交由线程池后就直接返回SUCCESS。

这样做的好处是什么?如果多个任务同时触发,那可能某些任务执行时间过长,请求可能会被阻塞住,而我们如果放在线程池中可以提高系统的吞吐量。

使用线程池的时候,往往我们的调用方都不需要考虑请求是否立马处理成功。假设线程池在处理任务的时候因为某些原因失败了,我们可以走报警机制(用邮件/短信等渠道去提醒请求方即可)。

不知道大家学过消息队列了没有,我们常常说消息队列是异步的,很多时候调用方的请求我们丢到消息队列里边,就告诉调用方我们这条请求处理成功了。实际上,这个请求可能还交由下游的多个系统去处理,下游的系统可能也是异步的…

在使用线程池的时候,很多时候我们也是把他当做异步来使(WebFlux实际上也是将请求丢到线程池嘛),只要我们的系统之间交互不是强一致性的,又希望提高系统的吞吐量,我们就可以考虑使用线程池。

轮询

有的时候,我们需要有一个线程去轮询处理某些任务。

比如,我的系统会有发短信的功能,我调用渠道商的下发接口的后,我需要拿到短信的回执信息,于是我就需要去调用渠道商的回执接口。

此时最简单的做法就是开一个线程,不断的轮询渠道商的回执接口(我们设定轮询的间隔时间即可)

Thread thread = new Thread(new Runnable() {
  @Override
  public void run() {
    while (true) {
      try {
        // 间隔一段时间轮询一次                                           
        TimeUnit.MILLISECONDS.sleep(period);

        // 调用接口
        String result = http.post();

        // 得到result后进行处理(比如将结果插入到数据库)
        smsDao.insert(result);
      }
    }
  });
thread.start();

或者有的时候,我们把任务放到内存阻塞队列或者Redis,也是通过一个线程轮询去取「队列」的数据。

借助juc包实现线程安全

juc其实就是java.util.concurrent包

我们在使用线程的时候,或者在日常开发的时候,都是得考虑我们现在使用的场景是否是线程安全的。

如果不是线程安全的,我们可以做什么东西来使我们的程序变得线程安全。

  • 如果是集合,我们可以考虑一下juc包下的集合类。
  • 如果是数值/对象,我们可以考虑一下atomic包下的类。
  • 如果是涉及到线程的重复利用,我们可以考虑一下是否要用线程池。
  • 如果涉及到对线程的控制(比如一次能使用多少个线程,当前线程触发的条件是否依赖其他线程的结果),我们可以考虑CountDownLatch/Semaphore等等
  • 如果synchronized无法满足你,我们可以考虑lock包下的类


img

涵盖Java后端所有知识点的开源项目(已有6 K star):https://github.com/ZhongFuCheng3y/3y

如果大家想要实时关注我更新的文章以及分享的干货的话,微信搜索Java3y。

PDF文档的内容均为手打,有任何的不懂都可以直接来问我(公众号有我的联系方式)。

Java3y.zip 立即下载

相关推荐

Apple 网页 SRP 登录系列文章(二):网页参数提取与会话初始化

本文深入解析了Apple网页SRP登录的第一个关键环节。文章首先指出Apple登录页面采用多层安全架构,包括跨域跳转机制和动态参数生成。重点介绍了四种关键参数(ServiceKey、SCNT、FrameId、ServiceNum)的提取技术,通过正则表达式和JSON路径解析从HTML脚本和HTTP头中获取。最后详细说明了会话初始化流程,包括访问初始页面和构建认证URL。这些技术细节揭示了Apple如何通过复杂机制确保登录过程的安全性。

Sayid_Des的专栏 1129

彻底解决SpringCloud TCP连接过多未释放问题~

为实现数据的可靠传输,TCP要在应用进程间建立传输连接。它是在两个传输用户之间建立一种逻辑联系,使得通信双方都确认对方为自己的传输连接端点。TCP的KeepAlive和HTTP的Keep-Alive是完全不同的概念,不能混为一谈。实际上HTTP的KeepAlive写法是Keep-Alive,跟TCP的KeepAlive写法上也有不同。

m0_73735578的博客 1175

香橙派5玩转SATA SSD:一个被忽略的overlays配置项,让你的Ubuntu系统飞起来

本文详细介绍了如何在香橙派5上通过配置`overlays=ssd-sata`启用SATA SSD作为系统启动盘,大幅提升Ubuntu系统的性能。文章深入解析了设备树覆盖的工作原理,提供了完整的配置流程和性能优化建议,帮助开发者充分发挥香橙派5的硬件潜力。

weixin_30787531的博客 219

WebFlux学习时常见的问题

前言只有光头才能变强。文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y回顾一下上篇我对WebFlux的入门,如果没读过的同学建议读一下再来看本篇文章,上一篇文章花了我很多的心血~~开局再来一张图,内容全靠编:这篇主要写写我初学时对WebFlux的一些疑问,不知道大家在看上一篇文章的时候有没有相应的问题呢?这次学WebFlu...

3y 2495

看完让你的RSA提升一个台阶 [GKCTF 2021]RRRRsa

我是,今天我给大家分享一个关于RSA的题目,带大家领略的魅力。今天开始前,我们先学习一下。

m0_62102520的博客 848

RuyiDify如何创建知识库API密钥:让程序安全访问知识库

知识库 API Key 是程序访问知识库的钥匙。创建它很简单,但真正重要的是知道它能做什么、应该放在哪里、不能暴露给谁。RuyiDify 讲这一步,不是为了让大家多记一个按钮,而是为了把知识库从“人工上传资料”推进到“程序化维护资料”。

未来已来,AI时代,学AI编程,做AI量化,就来大鹏AI教育。 133

面试官问:“在项目中用过多线程吗?”你就把这个案例讲给他听!

在面试当中,有时候会问到<b>你在项目中用过多线程么?</b> 对于普通的应届生或者工作时间不长的初级开发 ???—— crud仔流下了没有技术的眼泪。 博主这里整理了项目中用到了多线程的一个简单的实例,希望能对你有所启发。

三分恶的博客 2万+

华为OD机试 - 去除多余空格(Python/JS/C/C++ 2024 E卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。去除文本多余空格,但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标,去除多余空格后刷新关键词的起始和结束下标。条件约束:输入为两行字符串:第一行:待去除多余空格的文本,用例保证如果有单引号,则单引号成对出现,且单引号可能有多对。 第二

学Java,找哪吒 1215

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

3y 23万+

以太网MII、RMII、GMII、RGMII(三)

RMII接口收发的数据位宽为2bit,因此管脚数目大为减少,在高密端口PHY中应用较多,但是由于其是MAC和PHY共用一个参考时钟,接口之间的距离不能太远;一般的GMII接口都有两个发送参考时钟:TX_CLK和GTX_CLK,两者的方向是不一样的,前者有PHY提供(同MII),后者由MAC或外部参考时钟源提供,绝大多数GMII接口都是兼容MII接口的,在用作MII模式时,使用TX_CLK和8根数据线中的4根。MII接口中的接收时钟和发送时钟是分开的,而且都是由PHY芯片提供给MAC芯片的。

qq_42357877的博客 2330

Swin Transformer注意力计算复杂度为何比全局注意力少那么多?

本文对比分析了Vision Transformer(ViT)和Swin Transformer的计算复杂度。ViT采用全局注意力机制,计算复杂度为4[hwc^2]+2[(hw)^2C],当图像尺寸较大时计算量显著增加。而Swin Transformer采用窗口注意力机制,将图像划分为M×M的窗口(如7×7),计算复杂度降为4[hwc^2]+2[(hw)(M*M)*C]。以224×224图像为例,Swin Transformer的计算量比ViT减少约900倍,大幅节省了计算资源。文章通过矩阵乘法运算详细推导了

人工智能研究所的博客 62

但凡面试官考“多线程”,一定会问这10个问题!

随着技术人才大幅增长以及公司招聘更加严苛,程序员的职场正面临着前所未有的激烈竞争。以Java为例,不仅要了解操作系统、掌握JVM等知识点,还要深耕数据结构与算法,掌握Spring全家桶等框架。 而在这其中,对于并发与多线程的处理,也是一个优秀的技术工程师成长过程中必须攻下的难关。它贯穿着日常工作,也是入职面试重点考察的重点。 我们用5分钟复习一下并发与多线程。 01知识点汇...

weixin_30629653的博客 405

科研——ICONIP论文修改和提交

ICONIP说明文档

Blackoutdragon的博客 6646

vc 多线程只用到了3个cpu_我说我懂多线程,面试官立马给我发了offer,瞬间我就感动了!...

文章来源:https://blog.youkuaiyun.com/Java_3y/article/details/105357227原文作者:Java3y来源平台:优快云多线程大家在初学的时候,对这个知识点应该有不少的疑惑的。我认为主要原因有两个:多线程在初学的时候不太好学,并且一般写项目的时候也很少用得上(至少在初学阶段时写的项目基本不需要自己创建线程)。多线程的知识点在面试经常考,多线程所涉及的知识点非...

weixin_39624389的博客 309

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

面试官跟我扯了半小时 CountDownLatch 后,给我发 Offer?| 原力计划

作者 | 万猫学社责编 | 王晓曼出品 | 优快云博客一个长头发、穿着清爽的小姐姐,拿着一个崭新的Mac笔记本向我走来,看着来势汹汹,我心想着肯定是技术大佬吧!但是我也是一个才华横溢的...

优快云资讯 2850

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

面试官说我的简历像包装的,面试后面试官向我道歉了

都2021年了,你的工资涨了吗?小编的一个朋友入职现公司一年半了,领导丝毫没有要给他涨工资的想法。这不,马上赶上金三银四的黄金跳槽阶段,小编的朋友就去试了试水,结果铩羽而归,找我一顿吐槽。...

weixin_44421461的博客 710

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

本科渣渣已拿一线互联网大厂offer

看着标题有点吓人,实力未必有那么强,但是确实是自己第一次走出校园的一段经历。如果对找工作也还很迷茫的话,那么这篇文章确实值得一看。码字不易,还请点个关注/赞;坚持到最后会有一点小福利哦 从此处看页面更加简洁美观 二话不说先上图: 经过半个多月的面试,拿到了滴滴和蘑菇街的offer,虽然没有拿到bat的offer但是对于我来说这个结果还是可以的。面过啊里和腾讯最后还是失败了,确实能感觉到其...

qq_43115606的博客 1万+

QT多线程最佳实践 QT多线程‘骚操作’:面试官听完直接给offer!

‌当面试官听到你讲解QT多线程的‘移形换影大法’和‘纠结的信号槽’时,他的表情会从疑惑变成震惊!

QT性能优化QT原理源码QT界面美化 934

美团四面 Java 岗,终获 offer,我是这么回答面试官的

美团我是在智联网上投的简历,之前也投过一次,简历都没通过删选,后来花钱请人帮着改了一次简历,重新投另一个部门,获得了面试机会。12 月 4 日中午 HR 打电话过来预约了下午 4 点半面试,说会在线写代码,让我准备好网络环境。结果 5 点半还没打电话过来,被放鸽子。与 hr 重新沟通过后,确定 5 号下午再面,可是跟 hr 沟通预约这一套貌似在美团并没有什么用。

m0_74931226的博客 687

面试官眼中的‘海王‘:秋招中的多线程求职策略与心理博弈

本文探讨了秋招中多线程求职策略的技术合理性与心理博弈,分析了'海王'现象背后的系统调度思维和面试官的'反海王'探测机制。文章提供了工程化解决方案,如'面试线程池'管理法,并讨论了求职伦理边界和企业的反制策略,帮助求职者优化选择并维护诚信底线。

weixin_42548888的博客 380

我是如何在一晚上拿到阿里巴巴Android研发offer的?

希望本文对你有所启发,有任何面试上的建议也欢迎留言分享给大家。好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。好了~如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。

2401_84121588的博客 878

Java 面试如何坐等 offer?

2015 年,因为工作岗位的变动,开始负责给集团招聘一些技术人员,出于对公司的负责,也为了更好的胜任技术经理的职位,在面试的这件事上,我做了大量的“功课”,首先我研究了几乎所有大厂的面试题,还和负责招聘工作的几个朋友,详细的探讨了 Java 面试所要涉及的知识点,于是就有了今天大家看到的这 200 多道面试题。 为什么要公开这些面试题? 原因一:身边从事 Java 开发的人员越来...

优快云资讯 1898

厉害了!java多线程导出excel,成功拿到offer

一面:70分钟 突击电话面试 正思考着项目功能模块,阿里面试官打来了电话,开始了阿里一面。 阿里面试官自我介绍,介绍了5分钟左右,部门的情况,主要的业务 提问开始 会哪些操作系统 Linux会一点 说一下操作指令,怎么看cpu,看进程,看端口 操作系统进程间通信 追问了一个信号相关的问题,我不知道了。 io多路复用,说一说 面向切面编程,说一说那些场景 说说面向切面编程 给一个场景,有很多方法,找出耗时长的方法 spring的@autowired的作用 mybatis和hibernate的区别 C,C

m0_57767600的博客 1007

终于拿到了字节跳动的offer了,准备了五个月呀!激动

前言: 一个普通的本科生,开发3年多,在学习上也比较勤奋,在工作上也非常的认真,虽然梦想是进大厂,但是也知道这个时代Java的行业比较激烈,也非常的难进,所以用了整整五个多月的时间来学习,一边学习加固自己,一边在工作来加深自己的经验,但是在今年四月份的时候终于挤进了字节跳动这个大家庭。 心得: 每个面试官问的问题都不一样,相同点主要在流程方面。面试开始会让自我介绍,主要业务架构和技术架构两部分。 比如:技术架构部分,会根据自我介绍中提到的技术点问,是为什么使用这些技术,解决了哪些问题,碰到哪些困难,是如何.

lyl5454的博客 3688

IBM 上海 LBS offer入手总结

今天下午IBM上海那边的team leader给我打电话,说是已经可以给我这个岗位的口头offer了,后面就是走流程的事情。自己想来,还是应该把这次面试的经过好好整理一下。 IBM的这个职位应该是在51job上面投的,但是第一次看到入口应该是在大街网上。 投过之后大概三天不到吧,一个周三的下午,一个HR打电话过来问我安排时间的问题。问了我是不是还在香港,然后说一周内会有人电面技术面。 结果等

u010123326的博客 3881

面经分享:美团面试也太难了!4面美团终成Offer

这篇文章分享我一个学弟的美团实习面试经历,万万没想到现在大厂实习面试也这么难,下面是他的面经,各位读者老哥可以参考浏览。 美团我是在拉勾网上投的简历,之前也投过一次,简历都没通过删选,后来让学姐帮我改了一下简历,重新投另一个部门,获得了面试机会。10月23日中午HR打电话过来预约了下午4点半面试,说会在线写代码,让我准备好网络环境。结果5点半还没打电话过来,被放鸽子。与hr重新沟通过后,确定下周一下午再面,可是跟hr沟通预约这一套貌似在美团并没有什么用。 美团技术一面20分钟 晚7点,因为想到下周一才

Java圈全能架构师的博客 4807
上一篇: 面试官:你连SSO都不懂,就别来面试了
下一篇: 我采访了同事,让他掏出了每天都会浏览的干货网站...这几个网站也太牛了吧!
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论 65
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值