线程同步线程安全,字符串日期

60 篇文章 0 订阅

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设置初始值,需要这样去设置。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值