ThreadLocal 每个线程的局部变量,每个访问一个线程(通过它的get或set方法)都有自己的独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,它们希望将状态与线程(例如,用户ID或事务ID)关联。
package com.example.learnconcurr;
//import org.apache.log4j.Logger;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.ArrayList;
import java.util.EventListener;
import java.util.concurrent.atomic.AtomicInteger;
import static java.lang.Thread.sleep;
@Slf4j
public class myTest1 {
static final Logger logger = LoggerFactory.getLogger(myTest1.class);
static int counter = 0;
static Object suo = new Object();
public static void main(String[] args) throws FileNotFoundException, InterruptedException {
UnsafeTest unsafeTest = new UnsafeTest();
new Thread(()->{
System.out.println(unsafeTest.getx());
log.debug(unsafeTest.getx().toString());
unsafeTest.addx();
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(unsafeTest.getx());
log.debug(unsafeTest.getx().toString());
},"t1").start();
new Thread(()->{
System.out.println(unsafeTest.getx());
unsafeTest.addx();
System.out.println(unsafeTest.getx());
},"t2").start();
}
}
class UnsafeTest{
ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {
protected Integer initialValue(){
return new Integer("3");
}
};
//Integer threadLocal = new Integer("3");
ArrayList<String> arrayList = new ArrayList<>();
final public void method1(){
for (int i = 0; i < 100; i++) {
method2();
method3();
}
}
private void method2() {
arrayList.add("1");
}
private void method3() {
arrayList.remove(0);
}
public Integer getx() {
//return threadLocal;
return threadLocal.get();
}
public void addx() {
//threadLocal++;
threadLocal.set(threadLocal.get()+1);
}
}
java并发学习
https://www.bilibili.com/video/BV16J411h7Rd?p=81&spm_id_from=pageDriver