栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java原子变量类模拟多用户多线程访问

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java原子变量类模拟多用户多线程访问

文章目录
  • 原子变量类
  • 使用AtomicLong定义计数器

原子变量类

原子变量类基于CAS实现的,当对共享变量进行 read-modify-writer更新操作时,通过原子变量类可以保障操作的原子性与可见性,对变量的read-modify-writer更新操作是指当前操作不是一个简单的赋值,而是一个变量的新值依赖变量的旧值。

例如 i++ 的操作就是 读 -> +1 -> 赋值;

由于volatile无法保证原子性,只能保证可见性,原子变量类内部就是借助一个volatile变量,并且保障了该变量的 read-modify-writer 操作的原子性,有时把原子变量类看做增强的 volatile变量。

原子变量类:

分组原子变量类
基础数据类型AtomicInteger,AtomicLong,AtomicBoolean
数组型AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray
字段更新器AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,AtomicReferenceFieldUpdater
引用型AtomicReference,AtomicStampedReference,AtomicMarkableReference
使用AtomicLong定义计数器

开发一个程序统计请求的总数,成功数,失败数。模拟多用户多线程访问。

package se.high.thread.atomic.atomiclong;

import java.util.concurrent.atomic.AtomicLong;



public class Indicator {
    //构造方法私有化
    private Indicator(){}
    //定义一个私有的本类静态对象
    private static final Indicator INSTANCE = new Indicator();
    //提供一个公共静态方法返回该类的唯一实例
    public static Indicator getInstance(){
        return INSTANCE;
    }
    
    private final AtomicLong requestCount = new AtomicLong(0); //记录请求总数
    private final AtomicLong successCount = new AtomicLong(0); //记录请求成功数
    private final AtomicLong fialureCount = new AtomicLong(0); //记录请求失败数

    
    public void newRequestReceive(){
        requestCount.incrementAndGet(); //总数增长
    }
    
    public void requestSuccess(){
        successCount.incrementAndGet(); //成功数+1
    }
    
    public void requestFialure(){
        fialureCount.incrementAndGet(); //失败数+1
    }

    
    public long getRequestCount(){
        return requestCount.get();
    }
    public long getRequestSuccess(){
        return successCount.get();
    }
    public long getRequestFialure(){
        return fialureCount.get();
    }
}

package se.high.thread.atomic.atomiclong;

import java.util.Random;



public class AtomicTest {
    public static void main(String[] args) {
        // 通过线程模拟请求
        for (int i = 0; i < 10000; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //每个线程都是一个请求
                    Indicator.getInstance().newRequestReceive();
                    int num = new Random().nextInt();
                    if (num %2 == 0){
                        //偶数模拟成功
                        Indicator.getInstance().requestSuccess();
                    }else {Indicator.getInstance().requestFialure();}
                }
            }).start();
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //打印结果
        System.out.println("请求的总数--->"+Indicator.getInstance().getRequestCount());
        System.out.println("请求成功数--->"+Indicator.getInstance().getRequestSuccess());
        System.out.println("请求失败数--->"+Indicator.getInstance().getRequestFialure());

    }

}

请求的总数--->10000
请求成功数--->5035
请求失败数--->4965

进程已结束,退出代码为 0
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/292043.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号