这是我参与8月更文挑战的第29天,活动详情查看:8月更文挑战
先来说单例
- 单例模式是我们所熟知的设计模式,无论spring还有其他框架都都有应用
- 有很多优点,如:
- 不用频繁创建对象,省去new的消耗,减少系统的开销
- 减轻了GC的压力,缩短了GC停顿时间
public class Sinleton {
private Singleton() {
System.out.println("Singleton is Creating");
}
private static Singleton instance = new instance;
public static Singleton getInstance() {
return instance;
}
}
- 要注意的有几点
- instance对象必须是private的,而且要声明是静态static的,如果并行,就会导致instance为null
- 在创建的时候不受控制,在初始化创建以后,getInstance()方法不一定什么时候被调用
当然了,大家都是会手撕双重检验锁🔐的伙伴
并行情况
- 在并行情况下,读很少出问题,往往出问题在写的上面
- 但是为了保证数据的一致和正确,就要进行同步,但是同步就又会消耗了系统的性能
- 所以我们要提高并行程序的性能,可以使依靠对象的不变性
来看一个经典的多线程的生产者-消费者案例
- 生产者:用来提交用户的请求
- 消费者:在内存缓冲区提取并且处理任务
- 内存缓冲区: 将生产者提交的数据进行缓存,供消费者使用
- 以上代码是生产者线程的实现,创建的AData,放入队列(缓冲区)中
- 以上代码为消费者从BlockingQueue队列中取出AData对象
- 实体类作为数据或者任务
- 创建三个生产者和三个消费者,使得他们写作运行,主函数的
LinkedBlockingDeque为BlockingDeque的实现类
总结
- 由于有了缓冲区,可以一定程度上缓解了系统性能
下节我们一起来看无锁模式的生产者消费者