ThreadLocal 替代synchronized 写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Test {
    public static void main(String[] args) {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(20,20,0L, TimeUnit.SECONDS,new LinkedBlockingDeque<>());
        for (int i = 0;i<20;i++){
            executor.execute(()-> {
                try {
                    //System.out.println(DateUtilUnSafe.parse("2020-08-20 20:35:22"));
                    System.out.println(DateUtilSafe.parse("2020-08-20 20:35:22"));
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            });
        }
 
        executor.shutdown();
 
    }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package ThreadLocal;
 
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.SimpleFormatter;
 
public final class DateUtilUnSafe {
 
    private  static final SimpleDateFormat time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
//    /**
//     * 加了同步
//     * @param dateStr
//     * @return
//     * @throws ParseException
//     */
//    public static final synchronized Date parse(String dateStr) throws ParseException {
//        Date date = null;
//        date = time.parse(dateStr);
//        return  date;
//    }
    /**
     * 非同步
     * @param dateStr
     * @return
     * @throws ParseException
     */
    public static  Date parse(String dateStr) throws ParseException {
        Date date = null;
        date = time.parse(dateStr);
        return  date;
    }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package ThreadLocal;
 
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
public final class DateUtilSafe {
 
    private  static final ThreadLocal<DateFormat> THREAD_LOCAL = ThreadLocal.withInitial(()->new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
 
 
 
    /**
     * 非同步
     * @param dateStr
     * @return
     * @throws ParseException
     */
    public static final Date parse(String dateStr) throws ParseException {
        Date date = null;
        date = THREAD_LOCAL.get().parse(dateStr);
        THREAD_LOCAL.remove();
        return  date;
    }
}
DateUtilUnSafe如果不加synchronized多线程情况下会出现安全性问题,可以采用synchronized利用锁机制保证安全性,也可以采用
private  static final ThreadLocal<DateFormat> THREAD_LOCAL = ThreadLocal.withInitial(()->new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));  //为每个线程单独提供一份副本,使每个线程互不影响的使用

posted on   潮流教父孙笑川  阅读(111)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示