享元模式
将复杂对象拆分静态不变部分和动态变化部分,静态部分放在内存或redis中,使用的时候从内存或redis取出来复用,也就是说所有对象的静态部分在内存或redis中只保留了一份,动态变化部分一般放在redis中,使用的时候也从redis取出来和静态部分拼接起来。
Activity类定义了静态属性和动态属性stock的引用,Stock类定义了动态属性,享元工厂ActivityFactory类从内存activityMap中获取静态部分,RedisUtils类从redis中获取动态部分,ActivityController类把静态部分和动态部分拼接起来
补充
为了不引入其他组件只关注与享元模式本身,使用java.util.concurrent.atomic.AtomicInteger来模拟redis,创建定时任务线程池指定线程数量1来模拟库存的变化。
原子操作:一个任务在执行完毕之前不会被中断。java.util.concurrent.atomic包提供了AtomicInterger、AtomicLong、AtomicBoolean等原子变量类,这些类中的方法都提供了原子操作,例如AtomicInterger.addAndGet(2)、AtomicInterger.incrementAndGet()会原子的将变量值增加2或1并返回增加后的值,在多线程情况下多个线程对一个共享变量操作时,不需要额外的同步操作就可保持数据的一致性,确保数据安全。
原子性保证:这两个方法都利用了底层硬件和 Java 内存模型的支持来提供原子性保证。在单处理器系统中,这通常是通过禁用中断来实现的;在多处理器系统中,则可能需要使用更复杂的机制,如比较并交换(Compare-and-Swap, CAS)操作。
scheduleAtFixedRate()方法用于在初始延迟后首次执行任务,然后按照固定的周期频率重复执行任务。如果任务执行花费的时间比period长,那么下一次任务会立即在上一个任务完成后开始,而不会等待完整的period时间。这可能导致任务执行的时间间隔小于period。
scheduleWithFixedDelay()方法也是用于定期执行任务,但它考虑的是任务执行完成后的延迟时间。这意味着每次任务执行完成后,都会等待指定的延迟时间后再执行下一次任务。