
JavaEE
文章平均质量分 59
JavaEE
dl-kun
dalincun.com 联系我。管理员账户密码admin/234567
展开
-
什么是堆内存?参数如何设置?
而且指定的内存大小,并不是操作系统实际分配的初始值,而是 GC 先规划好,用到才分配。-Xmn, 等价于 -XX:NewSize,设置新生代内存,使用 G1 垃圾收集器 不应该 设置该选项,在其他的某些业务场景下可以设置。-XX:MaxDirectMemorySize=size,系统可以使用的最大堆外内存,这个参数跟。在 Java 中,堆内存主要用于分配对象的存储空间,只要拿到对象引用,所有线程都可。堆内存是指由程序代码自由分配的内存,与栈内存作区分。存不包括栈内存,也不包括堆外使用的内存。原创 2024-11-01 21:40:48 · 185 阅读 · 0 评论 -
G1 收集器有哪些特点?
G1 的全称是 Garbage-First,意为垃圾优先,哪一块的垃圾最多就优先清理它。程执行的 GC 动作,G1 收集器仍然可以通过并发的方式让 java 程序继续执行。G1 收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的。G1 GC 最主要的设计目标是:将 STW 停顿的时间和分布,变成可预期且可配置的。同的关注点,但 G1 除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明。:与 CMS 的“标记-清理”算法不同,G1 从整体来看是基于“标记-整理”算。原创 2024-11-01 21:40:11 · 138 阅读 · 0 评论 -
常用设计模式以及代码示例
Observer模式应该可以说是应用最多、影响最广的模式之一,因为Observer的一个实例Model/View/Control(MVC)结构在系统开发架构设计中有着很重要的地位和意义,MVC实现了业务逻辑和表示层的解耦。模板方法模式定义了一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。定义一系列的算法,把它们分别封装起来,使它们可相互替换,多个类只有在算法或行为上稍有不同的场景。将调用者和实现类解耦,提高了系统的可扩展性和灵活性。原创 2024-10-31 15:47:23 · 458 阅读 · 0 评论 -
23种设计模式 概念
六大设计原则首先在面向对象设计中,有六大设计原则被广泛接受,它们有助于指导开发者编写更灵活、可复用、易于维护的代码。单一职责原则 (Single Responsibility Principle, SRP)一个类应该只负责一个功能领域的事项。示例:一个订单处理类只处理订单相关的事务,而不应该处理库存管理。开放封闭原则 (Open/Closed Principle, OCP)软件实体应当向扩展开放,向修改封闭。示例:通过继承和多态,可以在不修改原有代码的情况下增加新功能。原创 2024-10-31 15:46:26 · 354 阅读 · 0 评论 -
自定义注解,防止重复提交(AOP切面实现)
/ 默认3秒内不允许重复提交。原创 2024-10-18 00:54:16 · 205 阅读 · 0 评论 -
@SpringBootApplication详解(2.7.18版本)
SpringBootApplication注解简化了Spring Boot应用的配置和启动过程。当我们在一个 Spring Boot 应用的主类上使用 @SpringBootApplication 注解时,它不仅指示 Spring Boot 自动配置应用程序,而且还负责启动组件扫描以发现和管理应用程序上下文中的 Bean,从而构建起整个应用程序的运行环境。@Inherited注解是 Spring Boot 中的核心注解,用于标记一个类作为 Spring Boot 应用程序的主入口点。原创 2024-10-18 00:52:43 · 1387 阅读 · 0 评论 -
Unsafe类
Unsafe类是Java中的一个特殊的类,它位于sun.misc包下,并不是一个公开的API,因此它的使用通常是不鼓励的,主要是因为其方法可能绕过Java的安全性和内存模型的保护,从而导致潜在的安全隐患和不可预测的行为。特点非公开API:不是一个公开的API,它主要用于内部实现目的。低级别的操作:提供了许多低级别的操作方法,可以直接访问和操作内存,执行指针运算等。内存操作:Unsafe类中有很多方法用于内存操作,如freeMemorygetByteputByte。原创 2024-10-18 00:45:43 · 206 阅读 · 0 评论 -
Synchronized锁升级
jdk1.8:无锁 -> 偏向锁 -> 轻量锁 -> 重量级锁jdk15:无锁 -> 偏向锁(默认不开启,耗费维护成本高) -> 轻量锁 -> 重量级锁。原创 2024-10-17 18:24:04 · 819 阅读 · 0 评论 -
Lock锁 Synchronized关键字 ReentrantLock
锁降级:在同一个线程里,获取写锁后可以再获取读锁,释放写锁后就持有了读锁,这种现象称为锁降级,这可以保证线程能读到最新修改的数据,其他线程读锁也能获取到这次更新,阻塞其他写操作来保证只读到当前写完的数据。Lock锁的实现ReentrantLock也是可重入锁,使用显式锁时,要注意释放锁和获取锁的次数保持一致,防止死锁。(如果频繁写入,可能出现读操作一直自旋的情况,效率降低)的情况下,可以显著提示并发性能,并且可以在乐观读途中获取到写锁,对数据进行更新,可以解决读写锁的写锁饥饿问题。原创 2024-10-17 17:22:47 · 732 阅读 · 0 评论 -
LockSupport与线程中断
并且unpark方法可以在park前执行,uppark相当于给当前线程提供一个许可,在稍后第一次调用park方法时不会阻塞,会消耗掉许可继续执行后续代码。LockSupport提供了线程阻塞和解除阻塞的方法,这些方法可以为创建高级别的同步结构提供支持。支持非阻塞编程风格,可以更好地控制线程的阻塞和唤醒时机,避免死锁等问题。提供的方法,线程之间可以进行简单的信号传递,从而协调彼此的工作。:使当前线程进入等待状态,直到被其他线程唤醒或被中断。方法可以使当前线程进入等待状态,直到被其他线程唤醒。原创 2024-10-17 17:13:38 · 325 阅读 · 0 评论 -
Java内存模型JMM volatile关键字
Java语言规范中定义的一套规则,它描述了程序中各种变量(线程共享变量)的访问方式,以及如何在并发环境中确保内存的一致性。JMM主要作用在于确保多线程程序在不同硬件平台上的正确执行,并为开发人员提供一套一致的内存访问规则。JMM的主要目的是解决由于多线程环境中的内存可见性和原子性问题,确保程序的正确执行。核心概念:主内存:所有线程共享的内存区域工作内存:每个线程私有的内存区域,存放该线程使用的变量副本。原创 2024-10-17 17:03:17 · 467 阅读 · 0 评论 -
CompletableFuture
在复杂的异步任务下处理起来比较力不从心,比如:在多个异步任务执行时,部分异步任务仍需要一定的顺序关系,且某些情况只要一个任务执行完就结束的情况。Future表示异步计算的结果,提供了cancel,isCancelled,isDone,get,get(long, timeunit)等方法。get()和join()均会阻塞等待任务的执行,返回执行结果,但get会抛出异常,编译期处理,join不需要抛出异常,可以后续处理异常。接口,同时提供了线程和Future接口的实现,可以提交线程执行,并阻塞等待线程结果。原创 2024-10-17 16:49:53 · 443 阅读 · 0 评论 -
JUC CAS Compare and Swap
CAS(Compare and Swap,比较并交换)是一种无锁算法中的原子操作,用于实现线程间的同步。在Java中,CAS操作主要通过包中的原子类(如AtomicLong等)来实现。CAS的原理CAS操作包含了三个参数:内存位置(V)、预期原值(A)和新值(B)。当内存位置的值与预期原值相匹配时,处理器会自动将该位置的值更新为新值;否则,操作失败,并返回原值。在多线程环境下,即使有多个线程尝试同时进行CAS操作,也只会有一个线程成功,其余线程会发现值已经被更改,并返回原值,保证了操作的原子性。原创 2024-10-17 16:48:24 · 346 阅读 · 0 评论 -
JUC Base
管程 (英语:Monitors,也称为监视器) 是一种程序结构,结构内的多个子程序(对象或模块)形成的多个工作线程互斥访问共享资源。管程实现了在一个时间点,最多只有一个线程在执行管程的某个子程序。与那些通过修改数据结构实现互斥访问的并发程序设计相比,管程实现很大程度上简化了程序设计。当所有用户线程都结束时,JVM会终止所有守护线程,并关闭JVM;如果还有任何一个用户线程在运行,守护线程将继续执行它们的任务。原创 2024-10-17 16:44:40 · 113 阅读 · 0 评论 -
JUC Atomic*类
以空间换时间,有base和cell属性,高并发情况下,cell数组会扩容,负责存储部分累加值。最终通过sum方法,将base值和cell数组里的累加值相加返回最终的数据。提升效率在于,减少了自旋次数,base值增加不成功时,不阻塞,而是转到cell数组里分段计数,通过空间来换时间,提升效率。原创 2024-10-17 16:44:04 · 216 阅读 · 0 评论 -
JUC AQS AbstractQueuedSynchronizer
Lock,内部聚合了抽象类Sync,抽象类Sync实现了继承了AQS,抽象类Sync的实现FairSync和NonfairSync分别实现了公平锁和非公平锁。例如在调用lock方法时,均会进入AQS的acquire方法,接着进入tryAcquire方法(钩子,父类实现直接抛出异常,子类可以不实现),区别在于公平锁在判断里多一个判断当前线程是否在头节点或者队列是否为空的条件,来实现先进先出的公平模式。AQS的release方法,unlock的时候调用。AQS的acquire方法,lock的时候调用。原创 2024-10-17 16:42:57 · 384 阅读 · 0 评论 -
javaee中常见的数据结构
这里替换长度不一定是initialCapacity+initialCapacity>>1,也有可能使用了addall,如果按这公式的扩容后长度仍不够,会将长度扩容为addall里的数据长度+当前长度,即可以容纳数据的最小长度、如果这个长度超过int类型最大值,会将数组长度设置int类型的最大值。1.8以前的链表采用头插法,多线程的情况下,并发扩容时,设置链表next指向时,可能会导致相互指向,从而出现死循环。数组是一段连续的存储空间,占用空间小,根据下标查询数据很快,插入数据快。1.8前:数组+链表。原创 2024-10-16 22:56:27 · 402 阅读 · 0 评论 -
线程Thread
而是设置线程的中断标志,线程将正常运行。如果线程不在阻塞状态,那么中断标志会被设置,线程可以在后续的代码中检查这个标志,并采取相应的行动。使用一个volatile变量,在其他线程修改变量值后,当前线程监听值的变化,进行下一步处理,停止、中断、或正常运行其他逻辑。线程中断和结束,原则上应该由线程自己判断,不应由其他线程强制中断,其他线程可以发出请求,决定权还是线程本身。run方法定义了线程要执行的任务,如果直接调用则会在当前线程中执行,相当于普通方法,不会新建线程。原创 2024-10-16 22:46:35 · 665 阅读 · 0 评论 -
线程池Thread Pool
为什么使用线程池池化思想,线程池的主要目的是减少在创建和销毁线程时所花费的开销和资源,提高程序性能、提高资源利用率,同时也提供了对并发执行任务的更好管理,例如控制线程数量。优势:线程复用、资源控制、方便管理。线程池七大参数corePoolSize:核心线程数,即使线程处于空闲状态也不会被回收maximumPoolSize:最大线程数,在核心线程和队列均满且线程数量未达到最大线程数时,创建新的线程处理任务。新建的线程在空闲超过设定的时间后,会销毁线程。原创 2024-10-16 22:47:14 · 1499 阅读 · 0 评论 -
ThreadLocal
它提供了一种机制,使得每个线程拥有自己的独立副本,从而避免了并发情况下线程间的数据共享和竞争问题。没有引用,比如设置为null时,但线程还在正常运行时,为了确保线程ThreadLocalMap的。对应的entry的value也设置为null,方便gc时清理没有引用的对象,释放内存。防止内存泄漏,使用线程池过程中,共享变量被重复读取导致业务异常。ThreadLocal的key是弱引用,为什么?,当线程数量较多时,可能会导致较高的内存消耗。的get,set,remove方法时,会将。由于每个线程都有自己的。原创 2024-10-16 22:44:53 · 176 阅读 · 0 评论 -
Java对象在堆内存中的存储布局
对象标记Mark Word:64位系统中占8个字节,存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄(Generation Age)、锁状态标志(Lock Status)、线程持有的锁、偏向锁ID(Biased Lock ID)、线程ID(Thread ID for Synchronized)等。字段可以是基本类型(如int, double等),也可以是指向堆中其他对象的引用(即对象的地址),还可以是指向方法区中的常量池的引用。如果对象是数组,对象头中还有记录数组长度的数据。原创 2024-10-16 22:41:41 · 220 阅读 · 0 评论 -
分布式相关
分布式系统(Distributed System)是一种由多个相互协作的计算机组成的系统,这些计算机通过网络互相通信和协调,共同完成一个或多个任务。分布式系统有哪些特点?原创 2024-10-16 22:48:56 · 314 阅读 · 0 评论 -
Java8函数式编程
函数式接口只有一个抽象方法的接口。这样的接口可以用作Lambda表达式的类型,并且可以被注解标记,以确保接口确实符合函数式接口的要求。接口中,属性的默认修饰符是public static final,方法的默认修饰符是public abstract。接口类也可以用abstract修饰,默认不写。原创 2024-10-16 22:41:09 · 172 阅读 · 0 评论