JAVA 面试小结分享
JAVA日常面试总结
之乎者也·
机车疾驰在路上,代码飞舞在指尖,热血与逻辑交织,创造属于我的数字世界。
展开
-
JAVA面试小结四十五:线程池(ThreadPool)相关工作原理?
这些参数共同决定了线程池的工作方式,包括如何分配任务,如何管理线程的生命周期,以及如何处理超出处理能力的任务。正确地设置这些参数可以帮助优化线程池的性能和资源利用率。通过这种方式,线程池能够高效地管理线程和任务,避免频繁创建和销毁线程,从而减少资源消耗,提高系统性能。同时,通过合理的配置,可以使得线程池适应各种不同的并发场景。原创 2023-11-01 14:47:55 · 67 阅读 · 0 评论 -
JAVA面试小结四十七:JAVA线程池都有哪?分别用于什么场景?他的原理是什么?
Java中的线程池是通过Executor框架实现的,其中包括ExecutorService、ThreadPoolExecutor等关键类和接口。当提交一个新任务时,如果线程池中的线程数量还未达到corePoolSize,就会创建一个新的线程来执行任务。如果线程数量已经达到corePoolSize但任务队列还未满,任务就会被放到任务队列中等待执行。如果任务队列已满,线程池会创建新的线程来处理任务,但线程数量不会超过maximumPoolSize。如果线程数量已经达到maximumPoolSize,就会根据拒绝原创 2023-11-01 14:53:56 · 114 阅读 · 0 评论 -
JAVA面试小结二十八:GC 是什么?为什么要有 GC?
XX:NewSize / XX:MaxNewSize — 设置新生代大小/新生代最大大小。的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动。颐养园时,就会触发一次完全收集(Major-GC),这里可能还会牵扯到压缩,GC 是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误。终身颐养园(Tenured):这是足够老的幸存对象的归宿。伊甸园(Eden):这是对象最初诞生的区域,并且对大多数对象来说,-Xms / -Xmx — 堆的初始大小 / 堆的最大大小。原创 2023-10-28 14:20:42 · 97 阅读 · 0 评论 -
JAVA面试小结五十一:JAVA中Future和Callable有什么作用呢?
4.callable的启动方式主要有两种,一种是利用FutureTask的构造方法,将callable作为参数传入;另一种调用submit方法提交到。1.FutureTask实现了Runnable和Future接口,它是带有状态和结果的任务,所有的操作都是围绕着任务状态展开的;总的来说,Callable和Future通常一起使用,它们使得我们可以更容易地处理并行计算并获取计算结果。2.如果任务状态不为NEW,表明任务已经完成或已经终止;5.底层还是使用了CAS完成一系列加锁和状态更改操作。原创 2023-11-04 12:30:53 · 87 阅读 · 0 评论 -
JAVA面试小结五十:JAVA同步工具类(Synchronization Classes)有哪些?
下面介绍三种同步类:是一个同步工具类,它允许一个或多个线程等待其他线程完成操作。为我们提供了一种并发流程的控制手段,它允许一个或多个线程等待其他线程完成操作。使用指定的数(也就是计数器,大于等于零)初始化CountDownLatch之后,每当调用countDown方法时,计数器就会减1,如果计数器的值还大于0,CountDownLatch的await方法会阻塞当前线程,直到计数器变为0,就会释放所有等待的线程。await方法后面的逻辑也将在所有释放的线程均执行完成之后得以执行,但计数器不能被重置。Count原创 2023-11-04 12:25:49 · 171 阅读 · 0 评论 -
JAVA面试小结四十九:JAVA并发集合(Concurrent Collections)有哪些?
是一个线程安全的 HashMap 实现。在JDK 1.7中,ConcurrentHashMap采用了一种叫做**分段锁(Segmentation Lock)**的技术。它内部包含多个Segment,每个Segment都拥有一个锁。当线程访问ConcurrentHashMap时,会根据哈希算法计算出应该访问哪个Segment,然后只锁定该Segment进行操作,其他线程访问其他Segment则不受影响,从而实现真正的并发访问。每个Segment都维护着一个HashEntry数组,用于存储键值对数据。原创 2023-11-04 12:07:09 · 97 阅读 · 0 评论 -
JAVA面试小结四十八:JAVA原子类(Atomic Classes)有哪些?
CAS操作包括三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。这个操作的功能是,当内存位置V的值等于预期原值A时,处理器会自动将该位置的值更新为B。原子性确保了在多线程环境下,对AtomicInteger的操作(如自增)是线程安全的,不会出现数据竞争的情况。可见性则保证了当一个线程修改了AtomicInteger的值,其他线程能够立即看到修改后的值。volatile保证了内存可见性,使得每次操作AtomicInteger时,都会强制将修改的值立即写入主存,确保了其他线程能立即看到修改后的值。原创 2023-11-01 14:59:52 · 54 阅读 · 0 评论 -
JAVA面试小结四十六:JAVA线程池的拒绝策略有哪些,以及他的原理和场景?
对于拒绝策略的选择,主要取决于具体的应用场景。例如,对于一些关键性的任务,可能需要选择AbortPolicy或CallerRunsPolicy,以确保任务被处理。对于一些非关键性的、可丢弃的任务,可以选择DiscardOldestPolicy或DiscardPolicy。需要注意的是,无论选择哪种策略,都需要考虑到它对系统性能和资源利用率的影响。线程池的拒绝策略有四种,分别是。原创 2023-11-01 14:50:37 · 241 阅读 · 0 评论 -
JAVA面试小结四十四:JAVA JUC介绍?
"Java juc" 是 "Java并发编程"(Java Concurrency Utilities)的缩写。Java 提供了一套丰富的并发编程工具,帮助开发者编写多线程、高并发的应用程序。这些工具主要集中在包中,因此也被简称为 "juc"。原创 2023-11-01 14:43:52 · 55 阅读 · 0 评论 -
JAVA面试小结四十三:Elasticsearch与关系型数据库对比
不同之处在于索引中的每个文档可以具有不同的结构(字段),但是对于通用字段应该具有相同的数据类型。群集是一个或多个节点(服务器)的集合,它们共同保存您的整个数据,并提供跨所有节点的联合索引和搜索功能。此名称很重要,因为如果节点设置为按名称加入群集,则该节点只能是群集的一部分。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。一个ES集群可以包含多个索引(数据库),每个索引又包含了很多类型(ES7中已作废),类型中包含了很多文档(行),每个文档又包含了很多字段(列)。原创 2023-10-31 09:58:33 · 93 阅读 · 0 评论 -
JAVA面试小结四十二:Lucene和Solr和Elasticsearch的区别
同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。Lucene是apache下的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。1.Elasticsearch是分布式的。6.Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。原创 2023-10-30 23:44:31 · 57 阅读 · 0 评论 -
JAVA面试小结四十一:elasticsearch 是如何实现 master 选举的
这个我看了各种网上分析的版本和源码分析的书籍,云里雾里。核对了一下代码,核心入口为 findMaster,选择主节点成功返回对应 Master,否则返回 null。第二步:比较:先判定是否具备 master 资格,具备候选主节点资格的优先返回;第一步:确认候选主节点数达标,elasticsearch.yml 设置的值。2、 最小主节点数(min_master_nodes)的目的是防止脑裂。1、 只有候选主节点(master:true)的节点才能成为主节点。若两节点都为候选主节点,则 id 小的值会主节点。原创 2023-10-30 23:38:47 · 142 阅读 · 0 评论 -
JAVA面试小结四十:Elasticsearch索引文档的过程
第三步:节点3在主分片上执行写操作,如果成功,则将请求并行转发到节点1和节点2的副本分片上,等待结果返回。所有的副本分片都报告成功,节点3将向协调节点(节点1)报告成功,节点1向请求客户端报告写入成功。第二步:节点1接受到请求后,使用文档_id来确定文档属于分片0。请求会被转到另外的节点,假定节点3。因此分片0的主分片分配到节点3上。(如果没有指定路由/协调节点,请求的节点扮演路由节点的角色。回借助路由算法获取,路由算法就是根据路由和文档id计算目标的分片id的过程。原创 2023-10-30 23:37:54 · 40 阅读 · 0 评论 -
JAVA面试小结三十九:ES 分片策略
ES(Elasticsearch)的分区策略主要涉及如何将索引数据分配给多个分片,以实现分布式的数据存储和查询。ES的分区策略是基于哈希算法的,通过将文档的ID或其他字段值进行哈希计算,然后将结果映射到特定的分片上,以实现数据的均匀分布。通过这种分区策略,ES可以实现数据的均匀分布,使得每个分片上的数据量大致相等,从而提高了系统的可扩展性和性能。同时,当一个节点发生故障时,其他节点上的分片仍然可以继续提供服务,增加了系统的可靠性和可用性。原创 2023-10-30 23:35:15 · 190 阅读 · 0 评论 -
JAVA面试小结三十八:lucene字典实现原理——FST
利用该结构可以很方便的进行查询,如给定一个term “dog”,我们可以通过上述结构很方便的查询存不存在,甚至我们在构建过程中可以将单词与某一数字、单词进行关联,从而实现key-value的映射。我们对“cat”、 “deep”、 “do”、 “dog” 、“dogs”这5个单词进行插入构建FST(注:必须已排序)。与前一个单词“deep”进行最大前缀匹配,发现是d,则在d边后增加新边o,o边指向终点。与前一个单词“do”进行最大前缀匹配,发现是do,则在o边后增加新边g,g边指向终点。原创 2023-10-30 23:34:06 · 170 阅读 · 0 评论 -
JAVA面试小结三十七:es压缩算法详解
首先回答前两个问题:数组肯定可以压缩,而且正是我们需要去做的;用FOR算法在这里进行压缩是可以的,不算错,但是我们说不合适,正如在FOR算法中介绍的那样,压缩的同时我们还有考虑解码时的效率,其实这里已经经过除法做了一次处理了,那么再用减法做一次处理,再解码时效率会降低不少,所以我们追求的是一种解码更加容器,但又能具备压缩能力的方法。但数值大小很大时,减法能够达到的效果是不明显的,比如100W,200W,300W,相减后是100W,100W,100W,依然很大,这时的压缩效果很不理想,所以引入了RBM算法。原创 2023-10-30 23:32:41 · 269 阅读 · 0 评论 -
JAVA面试小结三十六:ES优化策略有哪些
总之,Elasticsearch的优化需要从多个方面入手,综合考虑硬件、数据模型、查询语句和系统配置等方面的因素,以达到最佳的性能和可靠性。调整系统配置:通过调整系统的JVM参数、操作系统参数等配置,可以优化系统的性能和稳定性,提高Elasticsearch的运行效率。使用缓存:通过合理使用Elasticsearch的缓存机制,可以避免不必要的磁盘IO和网络传输,提高查询效率。优化查询语句:通过优化查询语句,使用合适的查询方式和过滤条件,可以减少查询的复杂度和提高查询效率。原创 2023-10-30 23:26:44 · 129 阅读 · 0 评论 -
JAVA面试小结三十五:ES相关面试题以及相关答案
倒排索引是一种将文档中的单词与包含这些单词的文档建立映射的数据结构。单词词典包含文档中出现的所有单词及其出现的频率和位置信息,倒排列表则包含包含某个单词的所有文档的列表。当文档被索引时,它会被分配到一个主分片上,然后副本分片会从主分片上复制数据,以提供数据的高可用性和故障恢复能力。映射定义了字段的名称、数据类型、分析器和其他属性,以确保索引和搜索的正确性和效率。分片可以提高索引的性能和可扩展性,使得数据可以分布在多个节点上,并且可以并行处理查询和索引操作。原创 2023-10-30 23:22:52 · 152 阅读 · 0 评论 -
JAVA面试小结三十四:java agent实现原理
通过Instrumentation API,Java Agent可以在类加载到JVM之前或之后,对类的字节码进行修改或分析,以实现各种功能,如性能监控、故障排查、代码热替换等。Java Agent的原理主要是通过Java的Instrumentation API和JVMTI(Java Virtual Machine Tool Interface)来实现的。总的来说,Java Agent的原理是通过Instrumentation API和JVMTI,在运行时对类的字节码进行修改或分析,以实现各种功能。原创 2023-10-30 23:20:37 · 430 阅读 · 0 评论 -
JAVA面试小结三十三:描述一下 DispatcherServlet 的工作流程
获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对。:对请求消息进行数据转换。析,得到请求资源标识符(URI)。成一个对象,将对象转换为指定的响应信息。:对请求消息进行数据格式化。执行拦截器的 preHandler(...)方法)。:验证数据的有效性(长度、格式等),验证结果存储到。:将请求消息(如 Json、xml 等数据)转换。的入参过程中,根据你的配置,Spring 将。中的配置对请求的 URL 进行解。象对应的拦截器),最后以。(附注:如果成功获得。原创 2023-10-28 15:11:02 · 69 阅读 · 0 评论 -
JAVA面试小结三十二:Java AOP有哪些类型的通知(Advice)?
返回后通知(After Returning Advice):在目标方法成功执行并返回结果之后执行的通知。异常后通知(After Throwing Advice):在目标方法执行过程中抛出异常后执行的通知。后置通知(After Advice):在目标方法执行之后执行的通知,无论方法是否成功执行。前置通知(Before Advice):在目标方法执行之前执行的通知。这些通知类型可以帮助你在不修改目标方法代码的情况下,对目标方法进行增强,实现代码的高内聚、低耦合。注解标记配置时执行。原创 2023-10-28 15:06:35 · 306 阅读 · 0 评论 -
JAVA面试小结三十一:Java 采用的是大端还是小端?
Java 采用的是**大端(Big-Endian)**字节序。这意味着在多字节数据(如整数、长整数等)的存储和传输过程中,Java 默认将最高位字节放在最低的内存地址处,而最低位字节放在最高的内存地址处。这种字节序被称为大端字节序。需要注意的是,虽然 Java 语言本身采用大端字节序,但在某些特定情况下(如网络通信或文件读写),你可能需要处理小端字节序的数据。在这种情况下,你需要手动进行字节序的转换。原创 2023-10-28 14:48:03 · 656 阅读 · 0 评论 -
JAVA面试小结二十九:Error 和 Exception 有什么区别?
四个选项 a. lack of memory;时也可能会遭遇 StackOverflowError,这是一个无法恢复的错误,只能重新修改。Exception 表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;Error 表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情。代码了,这个面试题的答案是 c。如果写了不能迅速收敛的递归,则很有可能引发。比如内存溢出,不可能指望程序能处理这样的情况;也就是说,它表示如果程序运行正常,从不会发生的情况。第 254 页 共 485 页。原创 2023-10-28 14:40:14 · 50 阅读 · 0 评论 -
JAVA面试小结三十:线程的基本状态以及状态之间的关系?
其中 Running 表示运行状态,Runnable 表示就绪状态(万事俱备,只欠 CPU),Blocked 表示阻塞状态,阻塞状态又有多种情况,可能是因为调用 wait() 方法进入等待池,也可能是执行同步方法或同步代码块进入等锁池,或者是调用 了 sleep()方法或 join()方法等待休眠或其他线程结束,或是因为发生了 I/O 中断。原创 2023-10-28 14:42:36 · 34 阅读 · 0 评论 -
JAVA面试小结二十七:面向对象的特征有哪些方面?
(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)服务,那么运行时的多态性可以解释为:当 A 系统访问 B 系统提供的服务时,B。有的或抽象的方法);系统有多种提供服务的方式,但一切对 A 系统来说都是透明的(就像电动剃须。变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。实现的是运行时的多态性(也称为后绑定)。封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问。原创 2023-10-28 14:07:49 · 34 阅读 · 0 评论 -
JAVA面试小结二十六:CAS 的问题
在 java5 中,已经提供了 AtomicStampedReference 来解决问题。比如需要保证 3 个变量共同进行原子性的更新,就不得不使用 synchronized 了。一个线程 a 将数值改成了 b,接着又改成了 a,此时 CAS 认为是没有变化,其实。之前说过了 CAS 里面是一个循环判断的过程,如果线程一直没有获取到状态,cpu。CAS 机制所保证的知识一个变量的原子性操作,而不能保证整个代码块的原子性。是已经变化过了,而这个问题的解决方案可以使用版本号标识,每操作一次。原创 2023-10-28 14:03:44 · 42 阅读 · 0 评论 -
JAVA面试小结二十五:什么是 CAS
java.util.concurrent.atomic 包下的类大多是使用 CAS 操作来实现的。cas 是一种基于锁的操作,而且是乐观锁。果内存地址里面的值和 A 的值是一样的,那么就将内存里面的值更新成 B。CAS 是 compare and swap 的缩写,即我们所说的比较交换。是通过无限循环来获取数据的,若果在第一轮循环中,a 线程获取地址里面的值被。观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访。而乐观锁采取了一种宽泛的态度,通过某种方式不加锁来处理资源,比如通。原创 2023-10-28 14:02:24 · 35 阅读 · 0 评论 -
JAVA面试小结二十四:Java CyclicBarrier 和 CountDownLatch 的区别
Java CyclicBarrier 和 CountDownLatch 的区别原创 2023-10-28 14:01:41 · 45 阅读 · 0 评论 -
JAVA面试小结二十一:创建线程的有哪些方式?
另外,还有通过实现Callable和Future创建线程池的方式,具体可以根据实际需求选择合适的创建方式。原创 2023-10-28 13:57:34 · 50 阅读 · 0 评论 -
JAVA面试小结二十三:Java 线程具有五中基本状态
3、其他阻塞:通过调用线程的 sleep()或 join()或发出了 I/O 请求时,线程会进入。1、等待阻塞:运行状态中的线程执行 wait()方法,使本线程进入到等待阻塞状态;的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再。处于就绪状态的线程,只是说明此线程已经做好了准备,随时。口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;:当线程对象对创建后,即进入了新建状态,如:Thread t。:当 CPU 开始调度处于就绪状态的线程时,此时线程。原创 2023-10-28 14:00:20 · 37 阅读 · 0 评论 -
JAVA面试小结二十二:创建线程的三种方式的对比?
1、Callable 规定(重写)的方法是 call(),Runnable 规定(重写)的方法是 run()。编写简单,如果需要访问当前线程,则无需使用 Thread.currentThread()方法,4、运行 Callable 任务可以拿到一个 Future 对象,表示异步计算的结果。2、Callable 的任务执行后可返回值,而 Runnable 的任务是不能返回值的。了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。原创 2023-10-28 13:59:35 · 79 阅读 · 0 评论 -
JAVA面试小结二十:多线程的价值?
多线程,可以真正发挥出多核 CPU 的优势来,达到充分利用 CPU 的目的,采用多。几个小任务,任务 B、任务 C、任务 D,分别建立程序模型,并通过多线程分别运。从程序运行效率的角度来看,单核 CPU 不但不会发挥出多线程的优势,反而会因。为在单核 CPU 上运行多线程导致线程上下文的切换,而降低程序整体的效率。假设有一个大的任务 A,单线程编程,那么。用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未。多线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数。原创 2023-10-28 13:54:19 · 41 阅读 · 0 评论 -
JAVA面试小结十九:并发编程三要素?
原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操。可见性指多个线程操作一个共享变量时,其中一个线程对变量进行修改后,其他。有序性,即程序的执行顺序按照代码的先后顺序来执行。作打断,要么就全部都不执行。线程可以立即看到修改的结果。原创 2023-10-28 13:50:07 · 80 阅读 · 0 评论 -
JAVA面试小结十八:线程池参数的说明?
这些参数共同决定了线程池的行为和性能,因此在实际使用中需要根据具体的应用场景和需求来合理地设置这些参数。原创 2023-10-25 10:50:05 · 38 阅读 · 0 评论 -
JAVA面试小结十七:redis的三种集群方式原来简介
当我们的存取的key到达的时候,redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。当Master主服务器被 Sentinel(哨兵)进程标记为客观下线(ODOWN)时,Sentinel(哨兵)进程向下线的 Master主服务器的所有 Slave从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。原创 2023-10-24 19:29:05 · 95 阅读 · 0 评论 -
JAVA面试小结十六:ZooKeeper的工作原理
当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和 leader的状态同步以后,恢复模式就结束了。当leader崩溃或者leader失去大多数的follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的 Server都恢复到一个正确的状态。3 .Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理。2 .接收Leader消息并进行处理;原创 2023-10-24 19:27:07 · 48 阅读 · 0 评论 -
JAVA面试小结十五:svn和git的区别
而Git只是获取文件的每个版本的 元素,然后只载入主要的分支(master)在我的经验,克隆一个拥有将近一万个提交(commit),五个分支,每个分支有大约1500个文件的 SVN,耗了将近一个小时!10)提交(Commit)在SVN,当你提交你的完成品时,它将直接记录到中央版本库,而Git的提交完全属於本地版本库的活动。4) Git的内容的完整性要优于SVN GIT的内容存储使用的是SHA-1哈希算法。1) 最核心的区别Git是分布式的,而Svn不是分布的。3) Git没有一个全局版本号,而SVN有。原创 2023-10-24 19:26:11 · 51 阅读 · 0 评论 -
JAVA面试小结十四:MVC 请求流程原理
第四步:前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)第三步:找到以后处理器映射器(HandlerMappering)像前端控制器返回执行链(HandlerExecutionChain)第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者注解进行查找。第八步:前端控制器请求视图解析器(ViewResolver)去进行视图解析。第十步:前端控制器对视图进行渲染。原创 2023-10-24 19:25:40 · 51 阅读 · 0 评论 -
JAVA面试小结十三:常用的设计模式介绍:单例模式、装饰者模式等
观察者模式:定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。组合模式:将对象组合成树形结构来表示“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。适配器模式:将一个类的接口转换成客户端所期望的接口,解决不兼容接口之间的问题。装饰器模式:动态地给一个对象添加一些额外的功能,而不需要修改其原始类。命令模式:将请求封装成对象,使得可以用不同的请求对客户进行参数化。工厂模式:将对象的创建委托给工厂类,客户端通过工厂类来创建对象。原创 2023-10-24 19:25:10 · 40 阅读 · 0 评论 -
JAVA面试小结十二:synchronize和lock区别?
(1)公平锁的锁获取,严格按照等待顺序进行锁获取,在获取锁的时候有一个判断hasQueuedPredeccssors(),同步队列中是否有前驱节点在等待获取锁,如果有,则放弃获取锁,而是添加到队尾,排队获取锁。其两者的区别在于:非公平锁,加大了新晋线程抢到锁的概率。非公平锁:一种获取锁的抢占机制,是随机获取锁的,和公平锁的区别就是先来的不一定先得到锁,导致某些线程可能一直拿不到锁,所以是不公平的。(2)非公平锁,是获取锁的顺序是随机的,甚至,有的线程可能会一直无法获取锁,出现线程饥饿情况。原创 2023-10-24 08:24:26 · 68 阅读 · 0 评论