1003 日 , 2025 20:53:15
CAS (CompareAndSwap)

CompareAndSwap,比较并交换

主要是通过处理器的指令来保证操作的原子性,它主要包含三个变量:

  • 内存地址变量
  • 旧的预期值 A
  • 准备设置的新值 B

如果一个线程需要修改一个共享变量,那先要拿出它的值赋给A,然后再基于A进行业务逻辑执行,得到新值B后,再拿原预期值(原来A的值)和共享变量比较,如果相同就认为其他线程没有修改共享变量,才能将B写入内存

 

CAS的缺点

  • CPU开销大:在高并发量的情况下,如果许多线程反复尝试更新某一个变量,却又一直更新不成功,又因为自旋锁自旋的的时候会一直占用CPU,造成CPU的浪费。
  • ABA 问题:线程 A 去修改 1 这个值,成功。但是中间线程 B 也修改了这个值,但修改后的结果也是 1,所以不影响 A 的操作,这就会有问题。可以用版本号来解决这个问题(也是乐观锁的一种具体实现)。
  • 只能保证一个共享变量的原子性
930 日 , 2025 11:36:23
==与equals的区别

==:

  • 对于基本数据类型:比较值是否相等
  • 对于引用数据类型:比较内存地址是否相同(即是否是同一个对象)

equals():

  • 比较两个引用类型(对象)的内容是否相等

Integer a=1000 ;Interger b ==1000     a==b为 false;因为1000大大超出了Integer的范围(-128——127)

911 日 , 2025 16:07:51
依赖注入

依赖注入是将对象的创建和依赖关系交给 Spring 容器来管理,类只需要声明自己所需的类(接口)的对象,IOC会在运行时将所需对象注入到类中(动态代理)。而在传统编程中,当一个类需要使用另一个类的对象时,需要通过new关键字创建一个所需对象,十分耦合。

常见的依赖注入的方式有:构造方法注入、Setter方法注入、字段注入(注解注入)

  • 构造方法注入:
    @Service
    public class UserService { 
    private final UserRepository userRepository; 
    // 构造器注入
    public UserService(UserRepository userRepository) { 
    this.userRepository = userRepository; } 
    }
  • Setter方法注入:
     public class PaymentService {
     private PaymentGateway gateway;
     public void setGateway(PaymentGateway gateway) { this.gateway = gateway; } }
  • 字段注入:
     @Service 
    public class OrderService {
     @Autowired
     private OrderRepository orderRepository; 
    }
    
    
911 日 , 2025 15:17:51
AOP面向切面编程

一种面向切面编程的思想。

面向切面编程中,核心业务功能和周边功能是分别独立进行开发,然后把切面功能和核心业务功能 “编织” 在一起。 AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

 

Spring AOP的实现依赖于动态代理技术。动态代理是在运行时动态生成代理对象

911 日 , 2025 9:48:54
IOC容器

控制反转,是一种创建和获取对象的技术思想

利用Spring提供的IOC容器,避免了new的显式创建对象,极大的降低了耦合度。

IOC 解决了繁琐的对象生命周期的操作

控制反转:其实是反转对象的控制权。IOC操作中,对象的控制完全脱离了我们的控制,控制权交给了 Spring 。

 也就是:我们由对象的控制者变成了 IOC 的被动控制者。