在设计系统的时候,为了防止雪崩效应我们都需要加入一些洪流控制,比如你有多个分库的时候,你肯定不会希望见到某一个分库挂掉的时候把整个应用都拖垮,通过一个简单的计数器我们就可以实现简单的洪流控制。
JDK 最新提供的java.util.concurrent.*下的类简化了多线程的编程,atomic类采用经典的compareAndSet模式,在不同步锁的情况下保证了多线程的数据安全,进而极大地提升性能。
//并发控制器
static AtomicIntegerArray floodCounter = new AtomicIntegerArray(16);
//最大并发量
public static int maxFloodCount = 10;
//权重
public static int QueryItemByIDFloodCount = 1;
public static void queryItemById(long id) {
int db = (int) (id % 16);
if (floodCounter.getAndAdd(db, QueryItemByIDFloodCount) > maxFloodCount) {
System.out.println("I'am busy!");
floodCounter.addAndGet(db, -QueryItemByIDFloodCount);
return;
}
System.out.println("do somthing!");
floodCounter.addAndGet(db, -QueryItemByIDFloodCount);
}
这个包下面还有ConcurrentHashMap等系列的map,list,set,极大地简化了在并发情况下使用这些常用类的难度,让开发人员不在为并发而头疼。
分享到:
相关推荐
在某些场景下,使用AtomicInteger比使用synchronized块或Lock更有优势,因为它避免了线程阻塞,减少了上下文切换的开销。 在实际应用中,我们可以用AtomicInteger来实现分布式系统中的序列号生成,或者作为并发缓存...
测试java.util.concurrent.atomic.AtomicInteger的类 与直接使用int做区别
自动轮播通常通过一个后台线程(如Handler或ScheduledExecutorService)来实现,这个线程每隔一定时间就更新AtomicInteger的值,进而触发ViewPager切换到下一页。同时,为了在用户触摸时暂停自动轮播,可以在...
对于简单的原子操作,AtomicInteger 是一个很好的选择。而对于复杂的同步需求,可能需要考虑使用 synchronized 关键字或显式的锁 Lock。 通过本文的介绍,你应该对 AtomicInteger 有了更深入的理解。在实际项目中,...
Java AtomicInteger类是Java中提供的一种原子操作的Integer类,通过线程安全的方式操作加减。它可以在高并发情况下使用,提供原子操作来进行Integer的使用。 Atomicinteger类的使用方法 在Java中,Integer类型的...
Java AtomicInteger类使用方法实例讲解 Java AtomicInteger类是Java语言中的一种高效的原子操作类,主要用于在高并发环境下的高效程序处理。AtomicInteger类提供了一种线程安全的加减操作接口,能够帮助开发者简化...
然后,通过比较两个场景的执行时间,得出了`AtomicInteger`操作与`int`操作的性能差距,大约在50-80倍之间。 值得注意的是,尽管`AtomicInteger`在单线程环境下可能较慢,但在多线程环境下,由于其线程安全特性,...
AtomicInteger是Java并发包下面提供的原子类,主要操作的是int类型的整型,通过调用底层Unsafe的CAS等方法实现原子操作。下面是对AtomicInteger的源码分析。 1. 什么是原子操作? 原子操作是指不会被线程调度机制...
AtomicInteger atomicInteger = new AtomicInteger(5); atomicInteger.compareAndSet(5, 2020) + \t current data is + atomicInteger.get()) /** * Atomically sets the value to the given updated value * if ...
在Java中,我们可以使用AtomicInteger或ConcurrentHashMap等线程安全的数据结构来实现计数器。当请求到达时,计数器加一,超过预设阈值则拒绝请求。为了确保跨服务的统一,这种计数器通常需要分布式实现,如Redis或...
AtomicInteger示例AtomicInteger用于原子增量计数器之类的应用程序。 简短的示例代码: public class AtomicIntegerExample { private final ExecutorService execService = Executors . newFixedThreadPool( 100 );...
通过使用`AtomicInteger`实现的简单计数器示例,我们可以看到,在多线程环境下,利用`AtomicInteger`能够有效地保证数据操作的原子性和线程安全性。这对于开发高性能、高并发的应用程序来说是非常重要的。此外,通过...
AtomicInteger类提供了一个原子操作的计数器,可以确保在并发环境下安全地增加或减少计数值。 3. **读取控制台字符串**:在服务器控制程序中,用户输入通常通过Scanner类来获取。Scanner可以从System.in(标准输入...
以下是一些核心的Java基础知识,这些内容通常会出现在笔试题或面试中: 1. **数据类型与变量**: - **基本数据类型**:包括整型(byte, short, int, long)、浮点型(float, double)、字符型(char)和布尔型...
在本文中,我们将深入探讨如何使用Java编程语言创建一个简单的计数器应用,该应用能够处理投票过程,并最终以立方图的形式展示结果。这个计数器的主要目标是记录投票数据,然后通过图形化的方式直观地展示出来。 ...
【Java打牌游戏与线程控制】\n\n在编程领域,尤其是游戏开发中,线程控制是一项重要的技术。Java打牌游戏是一个典型的实例,它展示了如何利用多线程技术来实现游戏流程的同步和异步操作。在这个游戏中,线程控制确保...
线程基础,线程池,生命周期
总的来说,根据当天日期自动生成单据号是Java开发中的一个基础任务,通过结合日期处理和序列号生成,我们可以创建出满足业务需求的唯一单据标识。这不仅提高了数据管理的效率,也为后续的数据分析和报表生成提供了...
【Java多线程简单下载器】是一个初学者的编程作业,虽然代码可能较为混乱,但其核心功能已经实现,即通过多线程技术进行文件的下载。在Java中,多线程是并发处理的重要手段,它允许多个任务在同一时间执行,从而提高...