JAVA并发处理经验(四)并行模式与算法1:生产者消费与单例模式

简介: 一、前言并行模式与算法是并发中常见的问题。例如一些常用的模式化处理,我们也会接触。但是在现在多核下,合理安排好并发保证数据安全一些基本的常识我们还是需要了解的。

一、前言

并行模式与算法是并发中常见的问题。例如一些常用的模式化处理,我们也会接触。但是在现在多核下,合理安排好并发保证数据安全一些基本的常识我们还是需要了解的。

二、并行模式与算法

2.1单例模式

借助内部类实现单例,只是在类加载的时候被创建一次,达到单例模式。
适应场景:工具类,实体初始化等
/**
 * Created by ycy on 16/1/15.
 * 单例模式
 */
public class SingletonDemo {
    private SingletonDemo() {
        System.out.println("singleton is create");

    }
    private static class SinggletonHodel {
        private static SingletonDemo instance = new SingletonDemo();
    }

    public static synchronized SingletonDemo getInstance() {

        return SinggletonHodel.instance;
    }
    public static void main(String[] args) {
                    System.out.println(SingletonDemo.getInstance());
    }
}

2.2 不变模式

将一些恒定的值在第一次加载类的时候固化,保证多线程环境下的安全;
适应 场景:我们java的基本类型都是这么玩耍的
public final class Product{
    private final String no;
    private final String name;
    private final double price;
    
    public Product(String no,String name,double price){
        super();
        this.no=no;
        this.name=name;
        this.price=price;
    }

    public String getNo() {
        return no;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }
}


2.3 生产者消费者模式 

具体研究google的disrupt框架,专业处理并发。这里给出阻塞的queue实现。(阻塞的性能没有disrupt快)

2.3.1 生产者与消费用用的数据模型

package pattern;

import javax.print.attribute.standard.RequestingUserName;

/**
 * Created by ycy on 16/1/15.
 */
public final class PCData {
    private final int intDate;//数据
    public PCData(int d){
        intDate=d;
    }
    public PCData(String d){
        intDate=Integer.valueOf(d);
    }

    public int getIntDate() {
        return intDate;
    }
   @Override
    public String toString(){
        return "date:"+intDate;
    }


}

2.3.2 生产者 通过block queue的offer插入数据进入队列

package pattern;

import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by ycy on 16/1/15.
 */
public class Producer implements  Runnable{
<h3>
</h3>    private volatile  boolean isRunning=true;
    private BlockingQueue<PCData> queue;//内存缓冲区
    private  static AtomicInteger count=new AtomicInteger();//总数.原子操作
    private static final int SLEEPTIME=1000;

    public Producer(BlockingQueue<PCData> queue){
        this.queue=queue;
    }
    public void run() {
    PCData data=null;
        Random r=new Random();
        System.out.println("start produer id=" +Thread.currentThread().getId());
        try{
            while (true){
                Thread.sleep(r.nextInt(SLEEPTIME));
                data=new PCData(count.incrementAndGet());//构造任务数据
                System.out.println(data+" is put into queue");
                if (!queue.offer(data,2, TimeUnit.SECONDS)){
                    System.out.println("failed to put data:"+data);//提交数据到缓冲区

                }
            }
        }catch (InterruptedException e){
            e.printStackTrace();
            Thread.currentThread().interrupt();
        }
    }
    public void stop(){
        isRunning=false;
    }
}

2.3.3 通过block的take提取数据模型,处理数据
package pattern;

import java.text.MessageFormat;
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.locks.Condition;

/**
 * Created by ycy on 16/1/15.
 */
public class Consumer implements  Runnable{
private BlockingQueue<PCData> queue;//缓冲 去
private static final int SLEEPTIME=1000;
    public Consumer(BlockingQueue<PCData> queue){
        this.queue=queue;
    }

    public void run() {
        System.out.println("start Consume id ="+Thread.currentThread().getId());
        Random r=new Random();//随机等待时间

        try{
            while (true){
                PCData data=queue.take();//提前任务
                if (null!=data){
                    int re=data.getIntDate()*data.getIntDate();//计算平方
                    System.out.println(MessageFormat.format("{0}*{1}={2}",data.getIntDate(),data.getIntDate(),re));
                }
            }
        }catch (InterruptedException e){
            e.printStackTrace();;
            Thread.currentThread().interrupt();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        //建立缓冲区
        BlockingQueue<PCData> queue = new LinkedBlockingDeque<PCData>(10);
        Producer p1 = new Producer(queue);
        Producer p2 = new Producer(queue);
        Producer p3 = new Producer(queue);

        Consumer consumer1 = new Consumer(queue);
        Consumer consumer2 = new Consumer(queue);
        Consumer consumer3 = new Consumer(queue);

        ExecutorService service = Executors.newCachedThreadPool();//建立线程池
        service.execute(p1);
        service.execute(p2);
        service.execute(p3);

        service.execute(consumer1);
        service.execute(consumer2);
        service.execute(consumer3);

        Thread.sleep(10*1000);

        p1.stop();
        p2.stop();
        p3.stop();

        Thread.sleep(3000);
        service.shutdown();

    }
}



目录
相关文章
|
17天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
50 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
5天前
|
设计模式 安全 Java
Java编程中的单例模式深入剖析
【10月更文挑战第21天】在Java的世界里,单例模式是设计模式中一个常见而又强大的存在。它确保了一个类只有一个实例,并提供一个全局访问点。本文将深入探讨如何正确实现单例模式,包括常见的实现方式、优缺点分析以及最佳实践,同时也会通过实际代码示例来加深理解。无论你是Java新手还是资深开发者,这篇文章都将为你提供宝贵的见解和技巧。
89 65
|
6天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
8 1
|
18天前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
66 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
2天前
|
设计模式 SQL 安全
Java编程中的单例模式深入解析
【10月更文挑战第24天】在软件工程中,单例模式是设计模式的一种,它确保一个类只有一个实例,并提供一个全局访问点。本文将探讨如何在Java中使用单例模式,并分析其优缺点以及适用场景。
6 0
|
6天前
|
SQL 设计模式 Java
[Java]单例模式
本文介绍了单例模式的概念及其实现方式,包括饿汉式和懒汉式两种形式,并详细探讨了懒汉式中可能出现的线程安全问题及其解决方案,如锁方法、锁代码块和双重检查锁(DCL)。文章通过示例代码帮助读者更好地理解和应用单例模式。
20 0
|
2月前
|
设计模式 安全 Java
Java 编程中的设计模式:单例模式的深度解析
【9月更文挑战第22天】在Java的世界里,单例模式就像是一位老练的舞者,轻盈地穿梭在对象创建的舞台上。它确保了一个类仅有一个实例,并提供全局访问点。这不仅仅是代码优雅的体现,更是资源管理的高手。我们将一起探索单例模式的奥秘,从基础实现到高级应用,再到它与现代Java版本的舞蹈,让我们揭开单例模式的面纱,一探究竟。
36 11
|
14天前
|
前端开发 算法 JavaScript
无界SaaS模式深度解析:算力算法、链接力、数据确权制度
私域电商的无界SaaS模式涉及后端开发、前端开发、数据库设计、API接口、区块链技术、支付和身份验证系统等多个技术领域。本文通过简化框架和示例代码,指导如何将核心功能转化为技术实现,涵盖用户管理、企业店铺管理、数据流量管理等关键环节。
|
14天前
|
设计模式 SQL 安全
【编程进阶知识】Java单例模式深度解析:饿汉式与懒汉式实现技巧
本文深入解析了Java单例模式中的饿汉式和懒汉式实现方法,包括它们的特点、实现代码和适用场景。通过静态常量、枚举类、静态代码块等方式实现饿汉式,通过非线程安全、同步方法、同步代码块、双重检查锁定和静态内部类等方式实现懒汉式。文章还对比了各种实现方式的优缺点,帮助读者在实际项目中做出更好的设计决策。
27 0
|
18天前
|
算法 Java Linux
java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
这篇文章介绍了如何在Java中使用Graphics2D在图片上绘制文字,并实现自动换行的功能。
48 0