Java——使用多线程模拟真实高并发业务并保证安全性(一)

简介: Java——使用多线程模拟真实高并发业务并保证安全性(一)

前言

兄弟篇:Java——使用多线程模拟真实高并发业务并保证安全性(二)

一、需求

使用100个线程往list中添加10000条数据,要求保证安全性,并正确记录数量。


二、实现

在看下面的代码之前,读者朋友可以自己先试一试怎么实现上面的需求,然后跟本文的实现方式对比一下。

2.1 使用技术

可重入锁ReentrantReadWriteLock,这里没有使用到CopyOnWriteArrayList,因为ReentrantReadWriteLock已经起到了CopyOnWriteArrayList对容器add的安全性的同等作用,另外还有对num++的保护。


2.2 实现代码

package com.han.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class TestMultiThread {
    static List<Integer> list = new ArrayList<Integer>();
    static ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    static int num = 0;
    static Random random = new Random();
    public static void main(String[] args) {
        // 使用100个线程模拟业务,可以根据需要增加或者减少线程数量
        for (int i = 0; i < 100; i++) {
            new Thread() {
                @Override
                public void run() {
                    try {
                        dosomething();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                };
            }.start();
        }
    }
    public static void dosomething() throws InterruptedException {
        // 设置每个线程最多处理100个数据
        int max = 100;
        // 使用10000作为测试范围,可以根据需要设置数量
        for (int i = 0; list.size() < 10000; i++) {
            if (max <= 0) {
                break;
            }
            readWriteLock.writeLock().lock();
            if (!list.contains(i)) {
                Thread.sleep(random.nextInt(5));
                list.add(i);
                num++;
                max--;
                System.out.println(Thread.currentThread().getName() + "***添加了" + num + "个,list数量:" + list.size());
            }
            readWriteLock.writeLock().unlock();
        }
    }
}
相关文章
|
设计模式 存储 缓存
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
357 0
|
设计模式 缓存 Java
【Java|多线程与高并发】线程池详解
Java线程池是一种用于管理和重用线程的机制,它可以在需要执行任务时,从线程池中获取线程,执行任务,然后将线程放回池中,以便后续使用。线程池可以有效地管理线程的数量,提高程序的性能和资源利用率。
【Java|多线程与高并发】线程池详解
|
设计模式 Java 容器
一篇神文就把java多线程,锁,JMM,JUC和高并发设计模式讲明白了
今天给大家分享一篇一线开发大牛整理的java高并发核心编程神仙文档,里面主要包含的知识点有:多线程、线程池、内置锁、JMM、CAS、JUC、高并发设计模式、Java异步回调、CompletableFuture类等。
|
Java 调度
【Java|多线程与高并发】wait和notify方法详解
在Java多线程环境中,线程之间是抢占式执行的,线程的调度是随机的.这就很难受了. 在很多情况下我们希望线程以我们想要的顺序来执行. 这就需要wait和notify这两个方法
|
安全 Java 调度
【Java|多线程与高并发】线程安全问题以及synchronized使用实例
Java多线程环境下,多个线程同时访问共享资源时可能出现的数据竞争和不一致的情况。
|
Java 容器
Java——使用多线程模拟真实高并发业务并保证安全性(二)
Java——使用多线程模拟真实高并发业务并保证安全性(二)
|
Java 程序员 开发者
疫情过后,Java开发者如何应对多线程与高并发面试题目?
发某粉丝年前参加某个NB企业的面试题列表: 聊聊synchronized的CPU原语级别实现 有一千万个数,写一个程序进行高效求和 已知2开平方为1.414,如何不用数学库,求开平方的值,精确到小数点儿后面10位 编码实现两个线程,线程A不断打印1-10的数字,要求在打印到第五个数字的时候通知线程B 自定义线程池需要指定哪7个参数,为什么不建议使用JUC内置线程池? 高并发、任务执行时间短的业务怎样使用线程池? 并发不高、任务执行时间长的业务怎样使用线程池? 并发高、业务执行时间长的业务怎样使用线程池? 设计一个12306网站,能够撑住最高百万级别TPS(淘宝最高54万TPS),你该如何实现
【Java|多线程与高并发】死锁以及哲学家吃饭问题
死锁(Deadlock)是多线程编程中的一个常见问题,指的是两个或多个线程相互等待对方释放资源,导致程序无法继续执行的状态。
|
安全 Java 开发者
【Java|多线程与高并发】JUC中常用的类和接口
JUC是Java并发编程中的一个重要模块,全称为Java Util Concurrent(Java并发工具包),它提供了一组用于多线程编程的工具类和框架,帮助开发者更方便地编写线程安全的并发代码。