美文网首页
并行模式1与算法

并行模式1与算法

作者: xinxinlimin | 来源:发表于2017-11-07 11:31 被阅读0次

    本节重点讲解应用于并行环境下的设计模式。对于初学者而言做到有据可依,而对于老鸟而言,具有一定的参考价值。

    单例模式:

    首先介绍两种简单的单例模式:

    一种是single类加载后初始化静态single变量时直接赋值,如:

    静态私有变量定义法

    当SingleTon中含有private 静态变量时,只要我们调用此变量,对象便会自动生成(加载),所以我们无法控制单例对象生成的时间。

    另一种是在getInstance方法里定义:

    判断法

    但是这里又有问题,当我们多线程环境下,getInstance方法必须是synchronized,否则多线程环境下输出可能是false。

    结合两种方式的新型方法:(既不会加载时生成对象, 也不用上锁同时实现线程安全)

    实时且线程安全

    不变模式

    不变模式指线程操作的对象实体具有不变性,即没有set方法;属性用私有、final修饰、类用final修饰,有一个构造方法。

    如String、Integer等,这就是为什么设置成final的原因,避免多线程操作下加锁影响效率。遵循不变原则后,只需要多线程访问即可,不用考虑线程同步问题,因为不会对实体数据进行修改。

    与只读的不同在于不变保证每时每刻都不变,有更加强大的约束力。

    生产者-消费者模式

    一般的生产者-消费者模式:定义Produce类实现runnable方法用于生成,定义custom类实现runnable方法用于消耗。Data类表示产品,主类生成拥有一个阻塞队列BlockingQueue(LinkedBlockingQueue)和定义指定个生产者消费者完成特定的任务。

    此模式的核心便在于阻塞队列中关于多线程put与take的操作。即线程的上下锁与阻塞、通知等。

    高性能生产者-消费者模式:无锁的实现

    上述方式通过并发包对阻塞队列的存取加锁来保证线程安全,但对于高并发的场景并不适用,即在此情景下,CPU对资源的上下锁、线程的阻塞畅通等都需要时间消耗。所以,并不完美,是否有一种可以不用加锁就能保证线程安全的方式那?答案是肯定的。

    无锁实现的关键在于将阻塞队列用环形队列RingBuffer代替。其秘诀在于大量使用无锁的CAS操作。但其编程非常困难。

    无锁缓存框架:Disruptor

    好在有Disruptor可以解决这个问题:它使用无锁的方式实现一个环形队列。

    例如:用Disruptor实现一个生产者-消费者模式

    相关文章

      网友评论

          本文标题:并行模式1与算法

          本文链接:https://www.haomeiwen.com/subject/rbrgpxtx.html