
面试题
文章平均质量分 89
似来
一个老程序员
展开
-
大厂面试题-Java并发编程基础篇(五)
因为Segment本身是基于ReentrantLock重入锁实现的加锁和释放锁的操作,这样就能保证多个线程同时访问ConcurrentHashMap时,同一时间只能有一个线程能够操作相应的节点,这样就保证了ConcurrentHashMap的线程安全。因为synchronized只提供了非公平锁的实现,而Lock提供了公平所和非公平锁的机制。ynchronized是Java内置的一个线程同步关键字,而Lock是J.U.C包下面的一个接口,它有很多实现类,比如ReentrantLock就是它的一个实现类。原创 2023-10-25 14:39:29 · 457 阅读 · 0 评论 -
大厂面试题-Java并发编程基础篇(四)
程序顺序规则,一个线程中的每个操作,happens-before这个线程中的任意后续操作,可以简单认为是as-if-serial也就是不管怎么重排序,单线程的程序的执行结果不能改变。第一种,就是阻塞队列里面已经包含了很多任务,这个时候启动多个消费者去消费的时候,它的有序性保证是通过加锁来实现的,也就是每个消费者线程去阻塞队列获取任务的时 候必须要先获得排他锁。所以,总的来说,并发是一个宏观概念,它指的是CPU能够承载的压力大小,并行是一个微观概念,它描述CPU同时执行多个任务的能力。原创 2023-10-24 15:56:18 · 101 阅读 · 0 评论 -
一线大厂问题详解(一)
1、在网页端打开登录页面,展示一个二维码,这个二维码有一个唯一编号是服 务端生成的。扫码登录的本质是,通过已经登录过的 App 应用,扫描未登录的 Web 端程序中的二维。去获取未读消息的时候,只需要查询大于当前维护的 msg_id_offset 的数据即。检索的时候,使用同样的方式去映射,只要看到每个映射的位置的值是不是 1,就可以。使用状态机的方式来实现幂等 ,在很多的业务场景中 ,都会存在业务状态的流转,据库 ,会给数据库造成很大的压力 ,如果订单表的数据量比较大的情况下,为什么还要单独拧出来说。原创 2023-09-05 14:08:04 · 249 阅读 · 0 评论 -
一线大厂问题详解(二)
一、从B站崩溃的故障排查和恢复过程中学到什么?2021 年7月 13 日晚上 22:52 ,B 站崩了。整个事件的罪魁祸首竟然只是,这么短短的几行代码;回到B站崩溃那天 ,仅不到半个小时 ,这个消息就冲上了微博的热搜头条。从B站出来的用户甚至带崩了 A 站、豆瓣、知乎等多个网站。有网友调侃说, B 站服务器一蹦 ,紧张加班的除了 B 站的程序员 ,同时让 A 站知乎、豆瓣、微博的程序员默默打开了电脑。B站崩溃的背后 ,背后的根本原因到底是什么呢?原创 2023-09-05 15:17:48 · 761 阅读 · 0 评论 -
大厂面试题-Java并发编程基础篇(三)
一、什么是守护线程,它有什么特点守护线程,它是一种专门为用户线程提供服务的线程,它的生命周期依赖于用户线程。只有JVM中仍然还存在用户线程正在运行的情况下,守护线程才会有存在的意义。否则,一旦JVM进程结束,那守护线程也会随之结束。也就是说,守护线程不会阻止JVM的退出。但是用户线程会!守护线程和用户线程的创建方式是完全相同的,我们只需要调用用户线程里面的setDaemon方法并且设置成true,就表示这个线程是守护线程。因。原创 2023-10-24 15:47:54 · 93 阅读 · 0 评论 -
大厂面试题-Java并发编程基础篇(二)
一、wait和notify这个为什么要在synchronized代码块中?1.wait和notify用来实现多线程之间的协调,wait表示让线程进入到阻塞状态,notify表示让阻塞的线程唤醒。2.wait和notify必然是成对出现的,如果一个线程被wait()方法阻塞,那么必然需要另外一个线程通过notify()方法来唤醒这个被阻塞的线程,从而实现多线程之间的通信。3. (如图)在多线程里面,要实现多个线程之间的通信,除了管道流以外,只能通过共享变。原创 2023-10-24 14:58:35 · 186 阅读 · 0 评论 -
大厂面试题-Java并发编程基础篇(一)
3. 而无界队列,就是没有设置固定大小的队列,不过它并不是像我们理解的那种元素没有任何限制,而是它的元素存储量很大,像LinkedBlockingQueue,它的默认队列长度是Integer.Max_Value,所以我们感知不到它的长度限制。这个判断也需要获取当前节点的前驱节点,同样采用双向链表能提高查找效率。新加入到链表中的线程,在进入到阻塞状态之前,需要判断前驱节点的状态,只有前驱节点是Sign状态的时候才会让当前线程阻塞,所以这里也会涉及到前驱节点的查找,采用双向链表能够更好的提升查找效率。原创 2023-10-24 14:33:45 · 124 阅读 · 0 评论 -
大厂面试题-Java基础篇(三)
是因为Java本身是一门面向对象的语言,对象是Java语言的基础单元,们时时刻刻都在创建对象,也随时都在使用对象,很多时候在传递数据时也需要对象类型,比如像ArrayList、HashMap这些集合,只能存储对象类型,因此从这个点来说,封装类型存在的意义就很大。3、在 SortedSet中,元素的添加和删除操作的时间复杂度为O(logn),而在List中,元素的添加和删除操作的时间复杂度为O(n),因为需要移动其他元素的位置。得该对象的保留位,最后计算出下标。当然,这是最官方的描述。原创 2023-10-23 15:11:08 · 116 阅读 · 0 评论 -
大厂面试题-Java基础篇(二)
对于Copy的效率,这个其实与操作系统和配置等情况相关,在传统的文件IO操作里面,们都是调用操作系统提供的底层标准IO系统调用函数read()、write(),由于内核指令的调用会使得当前用户线程切换到内核态,然后内核线程负责把相应的文件数据读取到内核的IO缓冲区,再把数据从内核IO缓冲区拷贝到进程的私有地址空间中去,这样便完成了一次IO操作。上面两种方式,都是在类加载的时候初始化,没有达到延迟加载的效果,当然本身影响不大,但是其实还是可以更进一步优化,就是可以在使用的时候去触发初始化。原创 2023-10-23 12:20:50 · 74 阅读 · 0 评论 -
大厂面试题-Java基础篇(一)
而实际的开发模式也都是基于面向接口来开发,所以基于接口 来实现动态代理,从需求和场景都是吻合的。在Java里面之所以要提供Integer这种基本类型的封装类,是因为Java是一个面向对象的语言,而基本类型不具备对象的特征,所以在基本类型上做了一层对象的包装并且提供了相关的属性和访问方法来完善基本类型的操作。在Integer这个封装类里面,除了基本的int类型的操作之外,还引入了享元模式的设计,对-128到127之间的数据做了一层缓存(如图),也就是说,如果Integer类型的目标值在-128到127之间,原创 2023-10-23 11:29:29 · 94 阅读 · 0 评论