Java限流-实现每秒n个请求

概要在大数据量高并发访问时,经常会出现服务或接口面对暴涨的请求而不可用的情况,甚至引发连锁反映导致整个系统崩溃。此时你需要使用的技术手段之一就是限流,当请求达到一定的并发数或速率,就进行等待、排队、降级、拒绝服务等。在限流时,常见的两种算法是漏桶和令牌桶算法算法。 限流算法令牌桶(Token Bucket)、漏桶(leaky bucket)和计数器算法是最常用的三种限流的算法。 1. ...
并发

读写锁之ReadWriteLock源码分析

ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁。读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的。所有读写锁的实现必须确保写操作对读操作的内存影响。换句话说,一个获得了读锁的线程必须能看到前一个释放的写锁所更新的内容。读写锁比互斥锁允许对于共享数据更大程度的并发。每次只能有一个写线程,但是同时可以有多个线程并发地读数据。ReadWriteLock适用于读多写少的...
并发

Fork/Join框架基本使用

1. 概述Java.util.concurrent.ForkJoinPool由Java大师Doug Lea主持编写,它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。本文中对Fork/Join框架的讲解,基于JDK1.8+中的Fork/Join框架实现,参考的Fork/Join框架主要源代码也基于JDK1.8+。 这几篇文章将试图解释Fo...
并发

LockSupport简单用法及原理

简介LockSupport是一个线程阻塞工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,当然阻塞之后肯定得有唤醒的方法。 作用接下面我来看看LockSupport有哪些常用的方法。主要有两类方法:park和unpark。 12345678public static void park(Object blocker); // 暂停当前线程public static void pa...
并发

ThreadLocal专题学习

通过ThreadLocal源码和相关问题专题学习…

并发

如何设计一个分布式锁?如何对锁的性能进行优化?

分布式锁的本质就是在所有进程都能访问到的一个地方,设置一一个锁资源, 让这些进程都来竞争锁资源。数据库、zookeeper, Redis。 通常对于分布式锁,会要求响应快、性能高、与业务无关。 Redis实现分布式锁 SETNX key value: 当key不存在时,就将key设置为value,并返回1。如果key存在,就返回0。 EXPIRE key locktime: 设置key的...
并发

as-if-serial规则和happens-before规则

我们知道为了提高并行度,优化程序性能,编译器和处理器会对代码进行指令重排序。但为了不改变程序的执行结果,尽可能地提高程序执行的并行度,我们需要了解as-if-serial规则和happens-before规则。

并发

为什么AQS底层是CAS + volatile

CAS操作和volatile简述CAS操作CAS是什么?CAS是compare and swap的缩写,从字面上理解就是比较并更新;主要是通过 处理器的指令 来保证操作的原子性 。 CAS 操作包含三个操作数: 内存位置(V) 预期原值(A) 更新值(B) 简单来说: 从内存位置V上取到存储的值,将值和预期值A进行比较,如果值和预期值A的结果相等,那么我们就把新值B更新到内存位置V上...
并发

Synchronized与ReentrantLock

Java 里面,最基本的互斥同步手段就是 synchronized 关键字,这是一种块结构( Block Structured )的同步语法。还有就是 Java 类库中新提供了 java. util.concurrent 包,其中的 java.util.concurrent.locks.Lock 接口便成了 Java 另一 全新的互斥 同步手段。

并发

两个线程交替打印数字和字母

  1. 使用LockSupportpark()unpark() 方法
  2. 使用wait()notify()方法
并发