ThreadLocal不好用?那是你没用对!(5)

简介: ThreadLocal不好用?那是你没用对!(5)

b) 解决线程安全问题:加锁


当出现线程安全问题时,我们想到的第一解决方案就是加锁,具体的实现代码如下:


import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
publicclass App {
    // 时间格式化对象
    privatestatic SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss");
    public static void main(String[] args) throws InterruptedException {
        // 创建线程池执行任务
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 10, 60,
                TimeUnit.SECONDS, new LinkedBlockingQueue<>(1000));
        for (int i = 0; i < 1000; i++) {
            int finalI = i;
            // 执行任务
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    // 得到时间对象
                    Date date = new Date(finalI * 1000);
                    // 执行时间格式化
                    formatAndPrint(date);
                }
            });
        }
        // 线程池执行完任务之后关闭
        threadPool.shutdown();
    }
    /**
     * 格式化并打印时间
     * @param date 时间对象
     */
    private static void formatAndPrint(Date date) {
        // 执行格式化
        String result = null;
        // 加锁
        synchronized (App.class) {
            result = simpleDateFormat.format(date);
        }
        // 打印最终结果
        System.out.println("时间:" + result);
    }
}


以上程序的执行结果为:


微信图片_20220120184641.jpg


从上述结果可以看出,使用了 synchronized 加锁之后程序就可以正常的执行了。


加锁的缺点


加锁的方式虽然可以解决线程安全的问题,但同时也带来了新的问题,当程序加锁之后,所有的线程必须排队执行某些业务才行,这样无形中就降低了程序的运行效率了


有没有既能解决线程安全问题,又能提高程序的执行速度的解决方案呢?


答案是:有的,这个时候 ThreadLocal就要上场了。

相关文章
|
设计模式 Java 应用服务中间件
Tomcat 架构原理解析到设计借鉴
Tomcat 架构原理解析到设计借鉴
441 0
|
8月前
|
负载均衡 网络协议 算法
一文读懂什么是Nginx?它能否实现IM的负载均衡?
Nginx(及其衍生产品)是目前被大量使用的服务端反向代理和负载均衡方案,从某种意义上来讲,Nginx几乎是低成本、高负载Web服务端代名词。 如此深入人心的Nginx,很多人也想当然的认为,在IM或消息推送等场景下是否也能使用Nginx来解决负载均衡问题? 另外,即时通讯网的论坛和QQ群里也经常有人问起,Nginx是否能支持TCP、UDP、WebSocket的负载
208 4
|
缓存 负载均衡 数据库
构建高性能微服务架构:策略与实践
【5月更文挑战第21天】 随着现代业务需求的不断演进,传统的单体应用架构已难以满足快速迭代和灵活部署的要求。微服务架构应运而生,以其服务的细粒度、独立性和弹性优势成为企业转型的重要选择。本文将深入探讨如何构建一个高性能的微服务系统,从服务划分原则到性能优化技巧,旨在为开发者提供一套系统的微服务性能提升方案。文章将重点讨论在设计高并发、低延迟的微服务时需要考虑的关键因素,包括服务治理、缓存策略、负载均衡以及异步通信机制等。
|
消息中间件 运维 监控
Linux Command strace 调试跟踪(1)
Linux Command strace 调试跟踪(1)
Linux Command strace 调试跟踪(1)
|
存储 算法 计算机视觉
【论文速递】CVPR2022 - MeMOT: 带有记忆的多目标跟踪
【论文速递】CVPR2022 - MeMOT: 带有记忆的多目标跟踪
|
Java Docker 容器
Docker中安装JDK1.8(二)
[root@localhost software]# java -version 显示cannot open shared object file: No such file or directory时需要安装:
747 0
Docker中安装JDK1.8(二)
selenium.common.exceptions.InvalidElementStateException Message Unable to perform W3C actions
selenium.common.exceptions.InvalidElementStateException Message Unable to perform W3C actions
210 0
|
缓存 NoSQL 前端开发
redis缓存不经常发生变化的数据-------从数据库中获得下拉列表的省份数据
redis缓存不经常发生变化的数据-------从数据库中获得下拉列表的省份数据
|
人工智能 分布式计算 前端开发
更高效的Cascades优化器 - Columbia Query Optimizer
在较早的文章中介绍了些Volcano/Cascades优化器框架的设计理念和实现思路,基本是基于论文的解读:VolcanoCascades虽然cascades号称目前最为先进的优化器搜索框架,但不得不说这2篇paper的内容,实在是让人看起来有些吃力。尤其是后篇,说是从工程实现的角度来描述,但讲解的不够详尽,而且有些地方既模糊又抽象。此外工业界并没有一款优化器是完全基于paper的框架去实现的,这
2299 0
更高效的Cascades优化器 - Columbia Query Optimizer
|
存储 Java 开发工具
仿写一个登录页(Java代码层)|青训营笔记
本文接前文的 布局篇 ,会讲述java代码层面相关的问题
仿写一个登录页(Java代码层)|青训营笔记