自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 收藏
  • 关注

原创 如何确保线程安全

Java提供了多个原子类,如AtomicInteger、AtomicLong等,它们可以保证对基本数据类型的原子性操作,避免了使用synchronized关键字和volatile关键字的限制。Java提供了多种线程安全的数据结构,如ConcurrentHashMap、CopyOnWriteArrayList等,这些数据结构内部已经实现了线程安全,可以直接使用。同时,应该避免使用非线程安全的数据结构和方法,避免使用可能会引起竞态条件和数据不一致的操作。将数据封装在线程内部,减少共享数据的需求。

2025-07-21 15:32:05 239

原创 CAS的实现与原理

在多线程环境下,CAS操作通过比较和交换来更新变量的值,是一种乐观锁的实现方式,可以避免锁机制带来的开销。● ABA问题:CAS无法直接解决ABA问题(一个值从A变到B,又变回A),可以使用带版本号的变量如AtomicStampedReference来解决这个问题。AtomicInteger类提供了以原子方式更新int型变量的方法,其中compareAndSet是CAS操作实现的核心方法。● 活锁:在高争用环境下,如果许多线程不断重试更新操作,可能会导致活锁,程序一直循环重试而得不到进展。

2025-07-21 15:29:36 434

原创 synchronized锁优化

它采用自旋的方式,即不放弃CPU的执行时间,尝试快速获取锁,避免线程阻塞和上下文切换的开销。当多个线程对同一个锁进行强烈争夺时,JVM会升级为重量级锁,此时线程会进入阻塞状态,等待锁的释放。这种方式适用于竞争激烈的情况,但会带来较大的性能开销。锁优化技术是为了提高synchronized的并发性能,根据锁的竞争程度和持有时间的长短选择相应的锁状态,使得多个线程能够更高效地共享资源。偏向锁是指当一个线程获取到锁之后,会在对象头中记录下该线程的标识,下次再进入同步块时,无需进行额外的加锁操作,从而提高性能。

2025-07-21 12:13:24 257

原创 谈谈你对反射的理解

反射是 Java 中一个非常强大的特性,它允许程序在运行时检查和操作类、接口、字段和方法。反射在面试中经常被问到,因为它涉及到 Java 的核心机制,并且在很多框架中都有广泛的应用。● 使用 CGLIB 或 Javassist:在某些情况下,Spring 会使用字节码生成库(如 CGLIB 或 Javassist)来代替反射,提高性能。通过反射,可以动态地获取类的信息、创建对象、调用方法、访问字段等。● 使用访问控制:在某些情况下,可以使用 AccessController 来限制反射的访问权限。

2025-07-21 12:11:41 576

原创 什么是守护线程?

需要注意的是,守护线程与普通线程在编写代码时没有太大的区别。可以通过将线程的setDaemon(true)方法设置为 true,将普通线程转换为守护线程。当只剩下守护线程时,JVM 会自动退出并且不会等待守护线程执行完毕。当所有的非守护线程都结束时,JVM 将会退出并停止守护线程的执行。当所有用户线程结束时,守护线程会自动停止。总结起来,守护线程在程序运行过程中提供了一种支持性的服务,会在所有的用户线程结束时自动停止。守护线程的优先级默认与普通线程一样。守护线程是在程序运行时在后台提供一种支持性的线程。

2025-07-21 11:58:32 174

原创 如何实现线程的同步

3.CountDownLatch方法比较少,操作比较简单,而CyclicBarrier提供的方法更多,比如能够通过getNumberWaiting(),isBroken()这些方法获取当前多个线程的状态,并且CyclicBarrier的构造方法可以传入barrierAction,指定当所有线程都到达时执行的业务功能;而调用CyclicBarrier的await方法,会阻塞当前线程,直到CyclicBarrier指定的线程全部都到达了指定点的时候,才能继续往下执行;

2025-07-21 11:56:14 354

原创 ArrayList和LinkedList有什么区别

3.插入和删除性能:ArrayList在尾部添加或删除元素的性能较好,因为它不涉及数组的移动。而在中间插入或删除元素时,ArrayList涉及到元素的移动,性能相对较低。LinkedList在任意位置进行插入和删除操作的性能较好,因为只需要调整链表中的指针即可。2.随机访问性能:ArrayList支持高效的随机访问(根据索引获取元素),因为它可以通过下标计算元素在数组中的位置。综上所述,如果需要频繁进行随机访问操作或在尾部进行插入和删除操作,可以选择ArrayList。

2025-07-21 11:52:07 291

原创 谈谈你对Java序列化的理解

序列化的主要目的是实现对象的持久化存储和传输,让对象可以在不同的计算机或不同的时间点被重建和使用。通过序列化,可以将对象的状态以字节的形式保存下来,并且在需要的时候进行恢复,从而实现了对象的跨平台传输和持久化存储。Java的序列化是指将Java对象转换为字节流的过程,可以将这些字节流保存到文件中或通过网络传输。● 答案:序列化可以将对象转换为字节流,方便存储或传输。需要注意的是,在进行序列化和反序列化时,对象的类和字段的定义必须保持一致,否则可能会导致序列化版本不匹配或字段丢失的问题。

2025-07-21 10:03:20 737

原创 如何判断一个对象是否可以被回收

如果只针对了java堆中的某一块区域进行垃圾回收(比如:典型的只针对新生代),必须考虑到内存区域是虚拟机自己的实现细节,更不是孤立封闭的,这个区域的对象完全有可能被其他区域的对象所引用,这时候就需要一并将关联的区域对象也加入GCRoots集合中去考虑,才能保证可达性分析的准确性。相对于引用计数算法而言,可达性分析算法不仅同样具备实现简单和执行高效等特点,更重要的是该算法可以有效地解决在引用计数算法中循环引用的问题,防止内存泄漏的发生,这里的可达性分析就是Java、c#选择的。用于记录对象被引用的情况。

2025-07-15 16:22:34 622

原创 HashMap底层原理

而长度 16 或者其他 2 的幂,length - 1 的值是所有二进制位全为 1, 这种情况下,index 的结果等同于 hashcode 后几位的值,只要输入的 hashcode 本身分布均匀,hash 算法的结果就是均匀的。这个问题,主要是 JDK1.7 的链表头插法造成的。这时的结构如下所示,还是个数组。● 当加载因子设置较大时,扩容门槛提高,扩容发生频率低,占用的空间小,但此时发生 Hash 冲突的几率就会提升,因此需要更复杂的数据结构来存储元素,这样对元素的操作时间就会增加,运行效率也会降低;

2025-07-15 16:08:47 604

原创 MySQL数据库事务和Spring事务

一个事务多次读取同一个数据,在该事务还未结束时,另一个事务也对该数据进行 了操作,而且在第一个事务两次读取之间,第二个事务对数据进行了更新,那么第一个 事务前后两个读取到的数据是不同的,这样就造成了不可重复读。在Spring 的事务框架中推荐的事务回滚方法是,在当前执行的事务上下文中抛出一个异常。一个事务正在对数据进行更新操作,但是更新还未提交,另一个事务这时也来操作这组数据,并且读取了前一个事务还未提交的数据,而前一个事务如果操作失败进行了回滚,后一个事务读取的就是错误的数据,这样就造成了脏读。

2024-11-05 23:27:25 1001

原创 微服务解决方案

现在微服务的解决方案一般有这三种:

2024-11-02 15:07:33 294 1

原创 微服务有什么好处?

这就意味着即使只有一个组件需要更多资源,也必须扩展整个应用程序,这就会导致资源浪费。此外,长时间不更新单体应用可能会收到安全威胁。单体应用程序的所有组件都是一个代码库,可能会导致开发团队之前的冲突和协作问题,尤其是大型团队中更为突出。微服务架构允许你根据需要的独立的扩展单个服务,而不必扩展整个应用程序,这提供了更高的可扩展性。微服务允许开发团队独立设计、开发和部署服务,这提高了灵活性,允许团队更快的推出新性能和更新。单体应用程序通常使用相同的技术栈,这会限制你在项目中使用最新的技术和工具的能力。

2024-11-02 10:05:53 577

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除