1.我们之前都是通过串行访问的访问资源
但是我们知道一件事,其实就是谁抢到了锁,谁可以去使用资源
这就是资源太少了,被迫一种方式
2.我们可以选择,多个核酸检测网点,来增加资源保证线程安全。
ThreadLocal为每个线程绑定自己值,相当于每个人一个网点,每个人都只使用自己的那个资源。
相当于给每一个线程一个独立值
每个线程都用自己的值,就不会发生哄抢问题了。
package org.example.testjul;
import java.util.ArrayList;
import java.util.List;
public class Test10 {
private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>();
//这个相当于,给线程每一个线程内部开辟了一块新的空间,然后往里面放一些数值
//相当于设置线程值
static class Subthread extends Thread{
@Override
public void run(){
for (int i = 0; i < 20; i++) {
threadLocal.set(i);
System.out.println("从里面取数值" + Thread.currentThread().getName() + threadLocal.get() );
}
}
}
public static void main(String[] args) {
Subthread subthread1 = new Subthread();
Subthread subthread2 = new Subthread();
subthread1.start();
subthread2.start();
}
}
在多线程环境中将字符串转化为日期
package org.example.testjul;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Test10 {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日%HH : mm : ss");
//这就相当于为每一个线程分配一个SimpleDateFormat对象,这样不会发生哄抢
//但是这样你也看到了。只适合于,SimpleDaterformat不会发生变化的情况,比如这个题目
private static ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<>();//给每一个线程一个私有对象
//相当于告诉电脑,字符串里yyyy是年,MM是月,dd是日,% 后面那个HH是小时,
//相当于一个转化格式,将日期转化为这种格式
static class ParseDate implements Runnable{
public static void main(String[] args) {
for (int i = 0; i < 55; i++) {
new Thread(new ParseDate(i)).start();//使用runnnble接口实现一个线程
//现在有100线程将字符串转为
}
}
private int i = 0;
public ParseDate(int i) {
this.i = i;
}
@Override
public void run() {
String text = "2088年4月17日%23 : 23 : " + i % 60;
//先判断当前线程有没有SimpleDateFormat对象,没有就创建一个,有就进行使用
if(threadLocal.get() == null){
//说明没有
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日%HH : mm : ss");
threadLocal.set(simpleDateFormat);
//没有就往里面放一个
}
//如果有这个对象直接用就行了
try {
Date parse = threadLocal.get().parse(text);
System.out.println(parse);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}
这种为每一个线程开辟一个这个情况只能适合于对象不发生变化的情况,相当于模板这个东西,每个人去分配一个模板,不然一个变化的数据你没办法给每个人都去分配一个对吧。
ThreadLoal设置初始值,需要这样去设置。