Java笔记:ThreadLocal和压力测试(2)

简介: Java笔记:ThreadLocal和压力测试

ThreadLocal同步

package com.example.demo;
// 自定义一个引用类型
public class Value<T> {
    private T value;
    public void set(T _value) {
        value = _value;
    }
    public T get() {
        return value;
    }
}

改造后

package com.example.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashSet;
@RestController
public class StatController {
    static HashSet<Value<Integer>> set = new HashSet<>();
    static ThreadLocal<Value<Integer>> count = new ThreadLocal(){
        @Override
        protected Value<Integer> initialValue() {
            Value<Integer> value  = new Value<>();
            value.set(0);
            addSet(value);
            return value;
        }
    };
    synchronized static void addSet(Value<Integer> value){
        // 临界区操作
        set.add(value);
    }
    void __add() throws InterruptedException {
        Thread.sleep(100L);
        Value<Integer> value = count.get();
        value.set(value.get() + 1);
    }
    @RequestMapping("/stat")
    public Integer stat(){
        return set.stream().map(x->x.get()).reduce((a, b) -> a+b).get();
    }
    @RequestMapping("/add")
    public Integer add() throws InterruptedException {
        __add();
        return count.get().get();
    }
}
$ ab -n 10000 -c 100 localhost:8080/add
$ curl localhost:8080/stat
10000

总结

  • 完全避免同步(困难)
  • 缩小同步范围(简单)+ ThreadLocal解决问题

源码分析

  • Quartz: SimpleSemaphore
  • MyBatis: SqlSessionManager
  • Spring

本地事务

A Atomic 原子性 操作不可分割

C Consistency 一致性 任何时刻数据都能保持一致

I Isolation 隔离性 多事务并发执行的时序不影响结果

D Durability 持久性 对数据接收的存储是永久的

自定义实现ThreadLocal

package com.demo.threadlocal;
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * 自定义实现ThreadLocal
 *
 * @param <T>
 */
public class MyThreadLocal<T> {
    // 自增接口保证唯一性
    static AtomicInteger atomic = new AtomicInteger();
    // 高德纳 hash值
    Integer threadLocalHash = atomic.getAndAdd(0x61c88647);
    static HashMap<Thread, HashMap<Integer, Object>> map = new HashMap<>();
    // 临界区上锁
    synchronized static HashMap<Integer, Object> getMap() {
        Thread thread = Thread.currentThread();
        if (!map.containsKey(thread)) {
            map.put(thread, new HashMap<>());
        }
        return map.get(thread);
    }
    protected T initialValue() {
        return null;
    }
    public T get() {
        System.out.println("atomic: " + atomic);
        HashMap<Integer, Object> map = getMap();
        if (!map.containsKey(this.threadLocalHash)) {
            map.put(this.threadLocalHash, this.initialValue());
        }
        return (T) map.get(this.threadLocalHash);
    }
    public void set(T val) {
        HashMap<Integer, Object> map = getMap();
        map.put(this.threadLocalHash, val);
    }
}
package com.demo.threadlocal;
public class TestMyThreadLocal {
    static MyThreadLocal<Long> threadLocal = new MyThreadLocal(){
        @Override
        protected Long initialValue() {
            return Thread.currentThread().getId();
        }
    };
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(()->{
                System.out.println(threadLocal.get());
            }).start();
        }
    }
}
相关文章
|
1月前
|
算法 IDE Java
Java 项目实战之实际代码实现与测试调试全过程详解
本文详细讲解了Java项目的实战开发流程,涵盖项目创建、代码实现(如计算器与汉诺塔问题)、单元测试(使用JUnit)及调试技巧(如断点调试与异常排查),帮助开发者掌握从编码到测试调试的完整技能,提升Java开发实战能力。
222 0
|
6月前
|
缓存 监控 负载均衡
如何提升 API 性能:来自 Java 和测试开发者的优化建议
本文探讨了如何优化API响应时间,提升用户体验。通过缓存(如Redis/Memcached)、减少数据负载(REST过滤字段或GraphQL精确请求)、负载均衡(Nginx/AWS等工具)、数据压缩(Gzip/Brotli)、限流节流、监控性能(Apipost/New Relic等工具)、升级基础设施、减少第三方依赖、优化数据库查询及采用异步处理等方式,可显著提高API速度。快速响应的API不仅让用户满意,还能增强应用整体性能。
|
5月前
|
存储 Java
【源码】【Java并发】【ThreadLocal】适合中学者体质的ThreadLocal源码阅读
前言 下面,跟上主播的节奏,马上开始ThreadLocal源码的阅读( ̄▽ ̄)" 内部结构 如下图所示,我们可以知道,每个线程,都有自己的threadLocals字段,指向ThreadLocalMap
450 81
【源码】【Java并发】【ThreadLocal】适合中学者体质的ThreadLocal源码阅读
|
2月前
|
安全 Java 测试技术
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
118 0
|
2月前
|
人工智能 Java 测试技术
Java or Python?测试开发工程师如何选择合适的编程语言?
测试工程师如何选择编程语言?Java 还是 Python?多位资深专家分享建议:Python 入门简单、开发效率高,适合新手及自动化测试;Java 生态成熟,适合大型项目和平台开发。建议结合公司技术栈、个人基础及发展方向选择。长远来看,两者兼通更佳,同时关注 Go 等新兴语言。快速学习与实践才是关键。
|
4月前
|
存储 安全 Java
深入探究Java中ThreadLocal的工作原理和用途
总结起来,ThreadLocal是Java多线程编程中一个非常有用的工具,通过为每个线程分配独立的变量副本,实现线程隔离,避免资
97 9
|
5月前
|
存储 缓存 安全
【Java并发】【ThreadLocal】适合初学体质的ThreadLocal
ThreadLocal 是 Java 中用于实现线程本地存储(Thread-Local Storage)的核心类,它允许每个线程拥有自己独立的变量副本,从而在多线程环境中实现线程隔离,避免共享变量带来的线程安全问题。
113 9
【Java并发】【ThreadLocal】适合初学体质的ThreadLocal
|
6月前
|
存储 设计模式 Java
重学Java基础篇—ThreadLocal深度解析与最佳实践
ThreadLocal 是一种实现线程隔离的机制,为每个线程创建独立变量副本,适用于数据库连接管理、用户会话信息存储等场景。
201 5
|
7月前
|
存储 数据可视化 测试技术
一个测试工程师的实战笔记:我是如何在Postman和Apipost之间做出选择的?
优秀的API测试工具应该具备: 分层设计:既有可视化操作,也开放代码层深度定制 场景感知:自动识别加密需求推荐处理方案 协议包容:不强迫开发者为了不同协议切换工具 数据主权:允许自主选择数据存储位置
188 7
|
8月前
|
存储 Java 开发者
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
本文详细介绍了 Java 中 `toString()` 方法的重写技巧及其重要
365 10
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。