java中应对高并发的两种策略

目的:提高可用性

通过ExecutorService实现队列泄洪

//含有20个线程的线程池
private ExecutorService executorService = Executors.newFixedThreadPool(20);

将有并发压力的下游代码放入到线程池的submit方法中,如下:

//同步调用线程池的submit方法 简单实现 拥塞窗口为20的队列泄洪(一个服务器同一时间只能处理20个请求,其他请求队列等待)Future<Object> future = executorService.submit(new Callable<Object>() {    @Override    public Object call() throws Exception {        //此处调用下游有并发压力的接口        return null;    }});try {    future.get();} catch (InterruptedException e) {    e.printStackTrace();} catch (ExecutionException e) {    e.printStackTrace();}

通过Guava RateLimit 负载均衡的情况下,在单机内部实现限流

需要加入Guava依赖

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>18.0</version>
  </dependency>
private RateLimiter rateLimiter = RateLimiter.create(300);//限制300tps

在方法入口内加上以下代码:

    //入口处限流
        if(!rateLimiter.tryAcquire()){
            //抛出异常;
        }

最后:

这里只简单描述了如何最简单的使用,降低高并发对系统的压力,没有剖析内部源码实现,望谅解

原文地址:https://www.cnblogs.com/wuba/p/11516985.html

时间: 2024-10-11 05:54:25

java中应对高并发的两种策略的相关文章

浅谈java中如何处理高并发的问题

1.从最基础的地方做起,优化我们写的代码,减少必要的资源浪费     a.避免频繁的使用new对象,对于整个应用只需要存在一个实例的类,我们可以使用单例模式.对于String连接操作,使用StringBuffer或StringBuilder,对于工具类可以通过静态方法来访问.     b.避免使用错误的方式,尽量不用instanceof做条件判断.使用java中效率高的类,比如ArrayList比Vector性能好. 2.html静态化     我们通过一个链接地址访问,通过这个链接地址,服务器

谈论java中如何处理高并发的问题

1 从最基础的地方做起,优化我们写的代码,减少必要的资源浪费.         a.避免频繁的使用new对象,对于整个应用只需要存在一个实例的类,我们可以使用单例模式.对于String连接操作,使用      StringBuffer或StringBuilder,对于工具类可以通过静态方法来访问.         b.避免使用错误的方式,尽量不用instanceof做条件判断.使用java中效率高的类,比如ArrayList比Vector性能好. 2 html静态化         我们通过一个

java中调用dll文件的两种方法

一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676   JNative地址:http://www.jb51.net/article/35232.htm JNA方法: 介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架

Java中serialVersionUID的解释及两种生成方式的区别(转载)

转载自:http://blog.csdn.net/xuanxiaochuan/article/details/25052057 serialVersionUID作用:        序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性.有两种生成方式:       一个是默认的1L,比如:private static final long serialVersionUID = 1L;       一个是根据类名.接口名.成员方法及属性等来生成一个64位的哈希字段,比如:    

Java中比较对象大小的两种实现方式

引入原因: Java中的对象,正常情况下,只能进行比较:== 或!= ,不能使用 < 或 > ,但是在开发时需要用到比较对象的大小 1.Comparable接口的使用(自然排序) 1.像String .包装类等实现了Comparable接口,重写了compareTo()方法,给出了比较两个对象大小的方法 2.像String .包装类等重写了compareTo()方法后,默认执行了从小到大的排序 3.重写compareTo()的规则: 如果当前对象this大于形参对象obj,则返回正整数,如果当

Java中的ReentrantLock和synchronized两种锁定机制的对比

多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 —— synchronized 和 volatile .在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使它变得更容易了. synchronized 快速回顾 把代码块声明为 synchronized,有两个

(转) Java中的ReentrantLock和synchronized两种锁定机制的对比

原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 -- synchronized 和 volatile .在简化与平台无关的并发类的开发的同时,它决没有使并

Java中实现数据交换的两种方式

/* *常用于底层的操作 */ public void swap(int a,int b){ a=a^b; b=b^a; a=a^b; System.out.print("a:"+a+"b:"+b); } /* *一个语句实现交换 */ public void swapone(int a,int b){ b=(a+b)-(a=b); System.out.print("a:"+a+"b:"+b); }

如何应对高并发 —— 动态网站静态化

零. 前言 为了应对高并发, 大多数网站在更新不频繁的页面都做了动态网页静态化处理. 典型的如: 淘宝的首页. 网易新闻的首页等. 当然这些网站加载速度这么快, 不仅仅是静态化, 还有 CDN. 缓存等各个方面的优化. 从阿里在 InfoQ 双十一架构的分享中提到使用 CDN + nginx + JBoss + 缓存作为 Detail 页面的架构, 将页面信息进行静态化缓存. 以上, 可以看出静态化技术的重要性及普遍性, 本文将结合具体实例介绍动态网站静态化. 一. 类及其依赖库  二. 代码实