本地线程:
1.ThreadLocal是什么
ThreadLocal正如他的中文翻译 线程本地变量所说,顾名思义,就是每个线程自己的本地变量。简单的来说,就是在多线程的程序中,我们一般会申请共享变量。给所有线程使用。但是很多情况下,每个线程会对共享变量进行改变。比如,一个String 类型的static变量,线程一将String 赋值为 “线程一”,然后在跑其他的逻辑的时候,第二个线程将String 又改成了“线程二”,那么就会出个问题,线程一跑到后面在对该String进行使用的时候,就发现值已经被改变了。
ThreadLocal的价值就体现了出来。就是在每个线程里面对变量单独记录保存。这样,线程二对String的改变就是对自己内部改变,不会影响别的线程中的String值。
针对这个,写个代码进行了一个测试,方便理解。
package zxy.maven.product;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
//
public class ThreadTest {
// threadLocal Test
public static ThreadLocal threadLocal = new ThreadLocal();
public static String baseString ="";
public static ExecutorService executorService=Executors.newFixedThreadPool(4);
private static void setTLocal(String value) {
threadLocal.set(value);
}
private static String getTlocal() {
return "ThreadLocal保存:"+Thread.currentThread().getName()+" : "+ threadLocal.get();
}
private static void setBLocal(String value) {
baseString=value;
}
private static String getBlocal() {
return "Baseocal保存: "+Thread.currentThread().getName()+" : "+baseString;
}
public static void main(String[] args) throws InterruptedException {
Thread thread=new Thread(new Runnable() {
public void run() {
setTLocal("子线程一保存变量");
try {
//睡眠一秒,模拟在处理某些程序
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getTlocal());
}
});
Thread thread2=new Thread(new Runnable() {
public void run() {
setTLocal("子线程二保存变量");
System.out.println(getTlocal());
}
});
executorService.execute(thread);
executorService.execute(thread2);
setTLocal("主线程保存变量");
System.out.println(getTlocal());
Thread.sleep(1000);
Thread thread3=new Thread(new Runnable() {
public void run() {
setBLocal("子线程一保存变量");
try {
//睡眠一秒,模拟在处理某些程序
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.err.println(getBlocal());
}
});
Thread thread4=new Thread(new Runnable() {
public void run() {
setBLocal("子线程二保存变量");
System.err.println(getBlocal());
}
});
executorService.execute(thread3);
executorService.execute(thread4);
setBLocal("主线程保存变量");
System.err.println(getBlocal());
}
}
看到结果,ThreadLocal保存的变量没有因为其他原因改变。但是Basecal的变了,因为当执行的时候,主线程执行完了输出,线程一将String 修改为“子线程一保存变量”,进入睡眠,线程二进行修改,改String 为子线程二,这时候输出的时候,就变成了两个子线程二了。
如此就体现了ThreadLocal的价值,就是保证线程之间的变量处理互不影响
锁Lock:
提示:这里可以添加要学的内容
例如:
1、 搭建 Java 开发环境
2、 掌握 Java 基本语法
3、 掌握条件语句
4、 掌握循环语句
Synchronized和Lock有什么区别:
提示:这里可以添加要学的内容
例如:
1、 搭建 Java 开发环境
2、 掌握 Java 基本语法
3、 掌握条件语句
4、 掌握循环语句
线程池都有哪些参数:
提示:这里可以添加要学的内容
例如:
1、 搭建 Java 开发环境
2、 掌握 Java 基本语法
3、 掌握条件语句
4、 掌握循环语句
线程池增加一个任务在线程池内部是怎么判断的:
提示:这里可以添加要学的内容
例如:
1、 搭建 Java 开发环境
2、 掌握 Java 基本语法
3、 掌握条件语句
4、 掌握循环语句
重入锁:
提示:这里可以添加计划学习的时间
例如:
1、 周一至周五晚上 7 点—晚上9点
2、 周六上午 9 点-上午 11 点
3、 周日下午 3 点-下午 6 点
有哪些线程安全的集合and怎么创建线程安全的集合:
提示:这里统计学习计划的总量
例如:
1、 技术笔记 2 遍
2、CSDN 技术博客 3 篇
3、 学习的 vlog 视频 1 个
volatile变量:
提示:这里统计学习计划的总量
例如:
1、 技术笔记 2 遍
2、CSDN 技术博客 3 篇
3、 学习的 vlog 视频 1 个