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();
        }
    }
}
相关文章
|
10天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
10天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
17天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
25 2
|
10天前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
28 0
|
1月前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
1月前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
1月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
1月前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
109 2
|
2月前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
31 5
|
22天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
10 0