带你了解「Java并行的世界」

1,240 阅读2分钟

这是我参与8月更文挑战的第29天,活动详情查看:8月更文挑战

先来说单例

  • 单例模式是我们所熟知的设计模式,无论spring还有其他框架都都有应用
    • 有很多优点,如:
    1. 不用频繁创建对象,省去new的消耗,减少系统的开销
    2. 减轻了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;
    }
}
  • 要注意的有几点
    1. instance对象必须是private的,而且要声明是静态static的,如果并行,就会导致instance为null
    2. 在创建的时候不受控制,在初始化创建以后,getInstance()方法不一定什么时候被调用

当然了,大家都是会手撕双重检验锁🔐的伙伴

并行情况

  • 在并行情况下,读很少出问题,往往出问题在写的上面
  • 但是为了保证数据的一致和正确,就要进行同步,但是同步就又会消耗了系统的性能
    • 所以我们要提高并行程序的性能,可以使依靠对象的不变性

来看一个经典的多线程的生产者-消费者案例

  • 生产者:用来提交用户的请求
  • 消费者:在内存缓冲区提取并且处理任务
  • 内存缓冲区: 将生产者提交的数据进行缓存,供消费者使用

图片.png

  • 以上代码是生产者线程的实现,创建的AData,放入队列(缓冲区)中

图片.png

  • 以上代码为消费者从BlockingQueue队列中取出AData对象

图片.png

  • 实体类作为数据或者任务

图片.png

  • 创建三个生产者和三个消费者,使得他们写作运行,主函数的LinkedBlockingDequeBlockingDeque的实现类

总结

  • 由于有了缓冲区,可以一定程度上缓解了系统性能

下节我们一起来看无锁模式的生产者消费者