腾讯-iEG-游戏前沿技术-后台开发一面面经

好吧,我明白了。
刚刚给我发了很多计算机科学技术方面的知识,进程和线程的区别,为什么线程比进程快,栈不共享的条件,协程,三种握手方式,HTTP/2 .0和3 .0的区别,目前Java解决方案的GC过程,Redis和MySQL的区别,查询缩减机制,实习中的返回更新机制,查找慢查询的具体方法,RESTFULAPI的特点以及如何求1 T整数的中位数数据。

您似乎正在复习技术知识或准备考试。
这个内容非常详细,涵盖了操作系统、网络、数据库和编程语言等很多方面。
如果您需要我更详细地解释或讨论其中一个或多个概念,或者您有具体问题,可以直接告诉我。
例如,我喜欢“你能更详细地解释一下 Java 的 G1 收集器是如何工作的吗?”这样的问题。
或“如何优化 MySQL 查询?”你想让我做什么?

Java经典面试题及答案(二)

哎呀,我告诉你,这些编程的东西真是让人头疼。
但如果你踩过很多陷阱,你就会习惯的。

我们来谈谈按值传递和按引用传递。
几年前,当我第一次学习Java时,我很困惑。
书上写的都是抄袭,引用的都是我看不懂。

比如传值,我在西安做项目的时候,有哥们写了一个方法,传入了一个int类型的参数进去。
他在方法中将int从1 改为2 调用方法后,外面的int还是1 没错,传值就是传递一份副本。
如果您更改副本,不会影响原始值。

至于通过引用传递,这就更复杂了。
我在北京的另一个项目中遇到了这个问题。
传入一个对象,例如 User 类的实例,然后在方法中更改 User 的名称。
往外一看,名字也变了。
为什么? 因为传入的是对象的引用,就像传递门牌号一样。
如果你改变了房子里的东西,当你向外看时,房子里的东西也会改变。

但这就是 Java 的奇怪之处。
它说它只能按值传递。
当您传递一个对象时,您实际上传递了引用的副本。
该副本仍然指向原始对象。
所以看起来是按引用传递,但本质还是按值传递。
你不明白,对吧? 我也在电脑前抓头发。

我们来谈谈进程和线程。
这让我印象很深。
去年在上海培训的时候,老师就讲过这个,让我点头。
进程就是大房子,线程就是住在大房子里的人。
一个进程有几个线程,线程之间共享家里的资源,比如冰箱、电视,但每个人都有自己独立的卧室和床。

进程的创建和切换是昂贵的,并且像移动一样麻烦。
线程变得更轻,切换就像更衣室一样,速度更快。
所以对于需要与外界进行大量交互的事情,比如读取文件、发出网络请求,多线程肯定更快。
之前有一个项目,是实现用户登录功能。
使用多线程,性能确实提升了不少。

创建线程有三种方法,当时我很纠结。
继承Thread类很简单,但Java只能继承单继承,所以它的使用受到限制。
实现Runnable接口要灵活得多。
任务和线程是分离的,这符合Java的设计思想。
这是我后来用的,感觉不错。
还有Executor框架,它更高级,可以管理一堆线程,所以你不用担心。
不过我用的不多,感觉很复杂。

我遇到了很多线程状态问题。
如果线程丢失或卡住,你必须检查最后的状态。
准备、运行、等待、睡眠,这些词你可能听起来很熟悉,但如果真的遇到问题,你就得一一检查。
例如,如果一个线程卡在等待 I/O 或死锁,那真是令人头疼。
关于死锁,前年我在搭建一个支付系统,差点就死锁了,因为两个线程抢了两个锁。
最后我加了一个序列限制,终于解决了。

我无法区分同步方法和同步代码块之间的区别。
后来一位老程序员告诉我,同步的方法就是锁定整个对象。
不管用不用,反正都要等。
只需同步代码块即可。
可以指定哪个代码块需要等待,这样就精确多了。
现在我使用同步代码块,感觉可靠的。

死锁确实很难防范。
我之前写过一个订单处理系统。
两个线程互相等待对方的锁,整个系统就卡住了。
那是一场悲剧。
后来我学会了一招。
所有线程拿锁的顺序都是固定的,比如先拿A,再拿B。
这样就不容易发生死锁。

集合框架,我每天都用这个。
List、Set、Map,这些公式我都能记住。
List是有序的,Set是无序的,Map是键值对。
使用起来很方便,但是必须了解每一套的实现细节,否则会出现性能问题。
例如,使用HashSet结果来查询效率很低,这会很令人沮丧。

至于为什么集合不实现Cloneable和Serialized,我也思考过。
毕竟每个集合的实现都是不同的。
如果克隆或序列化所有集合,不是会施加限制吗? 我们来谈谈序列化。
如果内部结构暴露,安全风险很高。
当年写了一个工具类,想克隆一个ArrayList来使用,结果发现没有实现,只好自己写一个深拷贝,很麻烦。

嘿,编程真的很难描述。
但经历过很多坎,你就会慢慢明白。
如果还有什么问题,我们再聊。

线程和进程的区别是什么

这是一个陷阱。
过多使用线程可能会导致资源争用和死锁。