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();

    }
}



目录
相关文章
|
13天前
|
存储 算法 安全
探究‘公司禁用 U 盘’背后的哈希表算法与 Java 实现
在数字化办公时代,信息安全至关重要。许多公司采取“禁用U盘”策略,利用哈希表算法高效管理外接设备的接入权限。哈希表通过哈希函数将设备标识映射到数组索引,快速判断U盘是否授权。例如,公司预先将允许的U盘标识存入哈希表,新设备接入时迅速验证,未授权则禁止传输并报警。这有效防止恶意软件和数据泄露,保障企业信息安全。 代码示例展示了如何用Java实现简单的哈希表,模拟公司U盘管控场景。哈希表不仅用于设备管理,还在文件索引、用户权限等多方面助力信息安全防线的构建,为企业数字化进程保驾护航。
|
3月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
112 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
3月前
|
设计模式 安全 Java
Java编程中的单例模式深入剖析
【10月更文挑战第21天】在Java的世界里,单例模式是设计模式中一个常见而又强大的存在。它确保了一个类只有一个实例,并提供一个全局访问点。本文将深入探讨如何正确实现单例模式,包括常见的实现方式、优缺点分析以及最佳实践,同时也会通过实际代码示例来加深理解。无论你是Java新手还是资深开发者,这篇文章都将为你提供宝贵的见解和技巧。
117 65
|
2月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
48 4
|
2月前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
2月前
|
设计模式 安全 Java
Java编程中的单例模式:理解与实践
【10月更文挑战第31天】在Java的世界里,单例模式是一种优雅的解决方案,它确保一个类只有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的实现方式、使用场景及其优缺点,同时提供代码示例以加深理解。无论你是Java新手还是有经验的开发者,掌握单例模式都将是你技能库中的宝贵财富。
81 2
|
2月前
|
设计模式 安全 Java
Java编程中的单例模式深入解析
【10月更文挑战第31天】在编程世界中,设计模式就像是建筑中的蓝图,它们定义了解决常见问题的最佳实践。本文将通过浅显易懂的语言带你深入了解Java中广泛应用的单例模式,并展示如何实现它。
|
3月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
34 1
|
3月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
123 2
|
2月前
|
设计模式 SQL 安全
Java编程中的单例模式深入解析
【10月更文挑战第24天】在软件工程中,单例模式是设计模式的一种,它确保一个类只有一个实例,并提供一个全局访问点。本文将探讨如何在Java中使用单例模式,并分析其优缺点以及适用场景。
20 0