- 博客(46)
- 资源 (1)
- 收藏
- 关注
原创 5.Java面试题之线程池如何知道一个线程的任务已经执行完成?
每个 Worker 在执行完一个任务后,会尝试从任务队列中获取下一个任务。在实际应用中,可能需要结合多种方法来准确跟踪任务的完成状态。当使用 Runnable 接口时,线程池通过 run() 方法的执行完成来判断任务是否结束。使用 Callable 接口时,线程池可以通过 Future 对象来判断任务是否完成。线程池通过多种机制来判断一个线程的任务是否已经执行完成。在这种情况下,当 run() 方法执行完毕,线程池就认为任务已经完成。可以定期检查线程池的活跃线程数来判断是否所有任务都已完成。
2024-08-16 16:47:43
143
原创 4.Java面试题之lock 和 synchronized 区别
Lock 和 synchronized 都是 Java 中用于实现线程同步的机制,但它们有一些重要的区别。我将通过代码示例来详细介绍这些区别。
2024-08-16 15:41:28
528
原创 3.MySQL面试题之Redis 和 Mysql 如何保证数据一致性?
Redis 和 MySQL 数据一致性是分布式系统中的一个常见挑战。保证数据一致性通常涉及几种策略,我会详细解释这些策略并提供相应的代码示例。使用消息队列来保证数据一致性,先更新数据库,然后发送消息到队列,由消费者来更新缓存。使用 Canal 监听 MySQL 的 binlog,然后更新 Redis 缓存。这种方法在更新数据库前后都删除缓存,并在第二次删除时增加短暂延迟。这种方法先更新 MySQL,然后更新或删除 Redis 缓存。这种方法先删除 Redis 缓存,然后更新 MySQL。
2024-08-16 14:14:37
207
原创 2.MySQL面试题之索引
聚簇索引:数据行的物理顺序与索引的逻辑顺序相同,主键索引通常是聚簇索引。非聚簇索引:数据行的物理顺序与索引的逻辑顺序不同,其他类型的索引通常是非聚簇索引。
2024-08-05 19:31:26
728
原创 2.MonggoDB是什么?
要想知道MongoDB是什么,我们得先搞清楚它不是什么,首先它不是关系数据,不是像下面这样这种格式存储数据。这个图展示了关系型数据库的常用存储方式,一个表格,里面存储了多行记录,并且表格和表格之间可以通过某个字段关联起来。
2024-08-04 09:08:41
58
原创 1.MongoDB入门指南之开篇
MongoDB大家可能听说过,但是要怎么学习?先学习哪个,很多人是不知道的,毕竟面对一个未知的事物,迷茫是很多人都会遇到的,从今天起我们就开始系统的介绍MongoDB的学习。课程主要分为基础、进阶、运维3个部分,详细内容为:主要讲解MongoDB的基础操作,帮助大家快速入门。讲解MongoDB的底层实现原理和高阶特性。从运维的角度介绍MongoDB的日常维护和故障诊断。
2024-08-03 15:20:56
213
原创 1.MySQL面试题之innodb如何解决幻读
在数据库系统中,幻读(Phantom Read)是指在一个事务中,两次读取同一范围的数据集时,由于其他事务的插入操作,导致第二次读取结果集发生变化的问题。InnoDB 作为 MySQL 的一个存储引擎,通过多种机制来解决幻读问题,主要包括锁机制和隔离级别。
2024-08-02 13:33:42
1645
原创 1.kafka面试题之零拷贝
Kafka 是一个高性能的分布式消息系统,它使用了多种优化技术来提高数据传输效率,其中之一就是 “零拷贝”(Zero Copy)。零拷贝技术可以显著减少数据在内存中的复制次数,从而提高 I/O 操作的效率,降低 CPU 使用率。以下是对 Kafka 零拷贝原理的详细介绍及其实现代码示例。
2024-08-02 07:00:00
699
原创 3.Java面试题之AQS
AQS(AbstractQueuedSynchronizer)是Java并发包(java.util.concurrent)中的一个抽象类,用于实现同步器(如锁、信号量、栅栏等)。AQS提供了一种基于FIFO队列的机制来管理线程的竞争和等待状态。其主要作用是简化同步器的实现,通过提供通用的同步状态管理和线程排队机制,使得开发者可以专注于特定同步器的逻辑。了解AQS的工作原理和应用场景是高级Java开发者需要掌握的重要技能。以下是一些常见的AQS面试题及其详细解答。
2024-08-01 18:30:00
1139
原创 2.Java面试题之线程池
Callable 是一个类似于 Runnable 的接口,但它可以返回一个结果或抛出异常。Future 表示一个异步计算的结果,可以用来获取 Callable 的返回值或检查任务是否完成。@Overridetry {// 阻塞等待任务完成并获取结果ForkJoinPool 是 Java 7 引入的一种特殊的线程池,设计用于处理可以递归拆分成更小任务的并行计算。它基于工作窃取算法,适合处理大规模并行任务。
2024-08-01 11:39:48
904
原创 1.Java面试题之事件机制
事件适配器类是一种提供空实现的抽象类或接口,它实现了某个事件监听器接口中的所有方法。使用适配器类可以避免在实现监听器接口时必须实现所有方法,从而简化代码。// 使用 MouseAdapter 而不是 MouseListener frame . addMouseListener(new MouseAdapter() {} });} }
2024-08-01 07:00:00
439
原创 31.jdk源码阅读之AtomicReference
AtomicReference 是 Java 中提供的一种用于处理对象引用的原子操作类。它在并发编程中非常有用,可以确保对对象引用的操作是原子的,避免了使用锁的开销。
2024-07-31 17:00:00
806
原创 30.jdk源码阅读之ReentrantReadWriteLock
ReentrantReadWriteLock 是 Java 并发包中的一个读写锁实现,它允许多个读线程同时访问共享资源,但在写线程访问时,所有的读线程和其他写线程都会被阻塞。不知道大家在日常工作中这个类使用的多不多,对于它的底层实现有没有思考过,比如下面几个问题大家可以看看日常有没有遇到过?
2024-07-31 10:07:53
1126
原创 29.jdk源码阅读之Exchanger
Exchanger 是 Java 并发包 (java.util.concurrent) 中的一个同步点工具类,用于在两个线程之间交换数据。它提供了一种简单而强大的方式来实现线程之间的数据交换。不知道大家在日常工作中或者面试中 有遇到它?
2024-07-30 18:00:00
777
原创 27.jdk源码阅读之ConcurrentLinkedDeque
ConcurrentLinkedDeque 是 Java 中一个高效、线程安全的双端队列(Deque),使用无锁算法(CAS 操作)来保证线程安全性。由于其复杂的实现和广泛的应用场景,它常常成为面试中的重点考察对象。不知道下面几个问题你在面试过程中有没有被问到过?
2024-07-30 07:00:00
566
原创 28.jdk源码阅读之CopyOnWriteArraySet
CopyOnWriteArraySet 是 Java 中一个线程安全的 Set 实现,它的底层是基于 CopyOnWriteArrayList 实现的。这种数据结构在并发编程中非常有用,因为它在写操作时会创建一个新的数组副本,从而避免了并发修改问题。
2024-07-29 19:43:06
1088
原创 26.jdk源码阅读之ConcurrentLinkedQueue
ConcurrentLinkedQueue 是 Java 中提供的一个基于无界非阻塞算法的线程安全队列。它是一个适用于高并发环境的队列实现,基于链表结构。
2024-07-29 18:00:00
1044
原创 25.jdk源码阅读之Executors
Executors 是一个工具类,提供了创建不同类型的 ExecutorService 和 ScheduledExecutorService 的静态工厂方法。在日常工作中涉及到并发编程基本都会用到这个,但是你真正了解它吗?下面这几个问题你是否有思考过?
2024-07-29 09:53:00
405
原创 24.jdk源码阅读之ExecutorService
ExecutorService 是一个非常重要的接口,用于管理和调度线程池。在日常工作中我们应该也是用的比较多,但是你真正了解它的底层实现原理吗?下面的几个问题在日常开发中你是否思考过?面试中是否被问到过?
2024-07-28 13:19:06
385
原创 22.jdk源码阅读之Thread(上)
Java 中的 Thread 类是多线程编程的基础,也是我们日常工作中用的比较多的类,但是你真的了解它吗?下面这几个问题你是否有思考过?
2024-07-27 14:56:25
698
原创 21.jdk源码阅读之AtomicLong
AtomicLong 是 Java 中提供的一个用于处理高效并发编程的类。它提供了一些原子操作,确保在多线程环境下的安全性和高效性。
2024-07-26 15:22:24
672
原创 20.jdk源码阅读之CompletableFuture
CompletableFuture 是 Java 8 引入的一个强大的类,用于异步编程和并发处理。它提供了丰富的 API,用于处理异步任务、组合多个异步任务、处理任务结果和异常等。
2024-07-26 09:58:27
689
原创 19.jdk源码阅读之FutureTask
FutureTask 是 Java 并发包中的一个重要类,它实现了 RunnableFuture 接口,结合了 Future 和 Runnable 的特性。FutureTask 通常用于异步任务的执行和结果的获取。
2024-07-25 14:31:34
921
原创 18.jdk源码阅读之CopyOnWriteArrayList
CopyOnWriteArrayList 是 Java 中的一种线程安全的 List 实现,基于“写时复制”(Copy-On-Write)机制。
2024-07-25 10:49:06
745
原创 17.jdk源码阅读之LinkedBlockingQueue
AbstractCollection 是 Java 集合框架中的一个抽象类,它实现了 Collection 接口的大部分方法,但不包括 size() 和 iterator() 方法。LinkedBlockingQueue 通过继承 AbstractCollection,获得了 Collection 接口的大部分实现。AbstractQueue 继承自 AbstractCollection,并实现了 Queue 接口的一部分方法。它提供了 offer()、poll() 和 peek() 方法的一些默认实现。
2024-07-24 13:46:20
1054
原创 16.jdk源码阅读之ArrayBlockingQueue
这是一个抽象类,部分实现了 Collection 接口。它提供了一些默认的方法实现,比如 addAll(), removeAll(), retainAll() 等。这是一个抽象类,部分实现了 Queue 接口。它提供了一些默认的方法实现,比如 add(), remove(), element() 等。
2024-07-24 09:52:25
1571
原创 15.jdk源码阅读之线程池(下)
在某些情况下,内置的拒绝策略可能无法完全满足需求,可以通过实现 RejectedExecutionHandler 接口来自定义拒绝策略。
2024-07-23 19:22:21
927
原创 14.jdk源码阅读之线程池(上)
拒绝策略是在线程池无法处理新任务时的处理方式。AbortPolicy:抛出 RejectedExecutionException。CallerRunsPolicy:由调用线程执行任务。DiscardPolicy:丢弃任务,不抛出异常。DiscardOldestPolicy:丢弃最早的未处理任务,然后尝试重新提交任务。这里我再问一个高级面试题:线程池的拒绝策略是谁来执行的?我们在文末给出答案,大家想思考下。
2024-07-23 10:05:46
976
原创 13.jdk源码阅读之Semaphore
定义一个名为 SemaphoreExample 的公共类定义一个常量 MAX_CONCURRENT_THREADS,表示最多允许同时访问共享资源的线程数,这里设置为3创建一个 Semaphore 实例 semaphore,初始许可数量为 MAX_CONCURRENT_THREADS。
2024-07-22 19:35:34
854
原创 12.jdk源码阅读之CyclicBarrier
CyclicBarrier 是 Java 并发编程中的一个重要工具,它允许一组线程相互等待,直到所有线程都到达某个公共屏障点。
2024-07-22 18:57:57
1007
原创 11.jdk源码阅读之CountDownLatch
CountDownLatch 是 Java 中的一个同步辅助类,位于 java.util.concurrent 包中。它允许一个或多个线程等待直到一组操作完成。CountDownLatch 的主要用途是在某些线程需要等待其他线程完成某些任务之后才能继续执行的场景。
2024-07-19 17:49:32
907
原创 10.jdk源码阅读之ReentrantLock
AQS 是 ReentrantLock 的底层实现基础。它维护了一个 FIFO 队列,用于管理等待线程,并提供了获取和释放锁的基本操作。
2024-07-19 10:26:09
1054
原创 9.jdk源码阅读之ThreadLocal
因此,建议在使用完 ThreadLocal 变量后调用 remove() 方法,以清除线程局部变量,避免内存泄漏。initialValue 方法返回当前线程的 ThreadLocal 变量的初始值。InheritableThreadLocal 是 ThreadLocal 的一个子类,它允许子线程继承父线程的线程本地变量。与 ThreadLocal 不同,ThreadLocal 变量在创建子线程时不会被继承。在这个示例中,每个线程都有自己独立的 threadLocalValue 副本,互不干扰。
2024-07-18 17:50:44
861
原创 1.【Mojo编程语言】-认识Mojo
Mojo 是一种结合了 Python 的易用性和 C++ 的高性能的新兴编程语言,特别适用于高性能计算和并行编程。通过其简洁的语法、强大的并行编程模型和对底层硬件的控制,Mojo 为开发者提供了一种高效而灵活的编程工具。随着其生态系统和社区的不断发展,Mojo 有望在高性能计算领域中发挥重要作用。
2024-07-18 11:04:52
412
原创 8.jdk源码阅读之ConcurrentHashMap(下)
上一篇文章我们从ConcurrentHashMap的日常使用开始,讲解了ConcurrentHashMap的源码,这篇文章我计划再深入研究一下ConcurrentHashMap的源码。
2024-07-18 10:36:27
732
原创 7.jdk源码阅读之ConcurrentHashMap(上)
上面的代码介绍了ConcurrentHashMap的基本用法,我们接下来详细看看各个部分。
2024-07-17 09:59:59
408
原创 6.jdk源码阅读之HashMap(下)
因为是头插法,所以HashMap的顺序已经发生了改变,但线程T2对于发生的一切是不可知的,所以它的指向元素依然没变,如上图展示的那样,T2指向的是A元素,T2.next指向的节点是B元素。因为T1执行完扩容之后B节点的下一个节点是A,而T2线程指向的首节点是A,第二个节点是B,这个顺序刚好和T1扩完容完之后的节点顺序是相反的。与 JDK 7 类似,JDK 8 中的 HashMap 在扩容过程中,如果多个线程同时进行插入操作,可能会导致数据结构的不一致,甚至形成环形链表,导致死循环。
2024-07-16 14:38:59
619
原创 5.jdk源码阅读之HashMap(上)
HashMap 继承自 java.util.AbstractMap,这是一个提供 Map 接口的骨架实现的抽象类。AbstractMap 提供了一些基本的方法实现,例如 equals(), hashCode(), toString(), 以及一些其他方法。
2024-07-15 20:00:06
636
Spring+SPringMVC+Mybatis+Shiro+Maven实战交友网站视频教程
2018-03-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人