Immutable设计 SimpleDateFormat DateTimeFormatter

server/2025/2/4 10:07:37/

专栏系列文章地址:https://blog.csdn.net/qq_26437925/article/details/145290162

本文目标:

  1. 理解不可变设计模式,时间format有线程安全要求的注意使用DateTimeFormatter

目录

  • Immutable
    • SimpleDateFormat 非线程安全
    • 可以`synchronized`解决,但效率低
    • DateTimeFormatter 线程安全
      • 线程安全原理
      • 其它不可变设计模式例子
        • Java String类为什么是final的?

Immutable

[ɪˈmjuːtəbl][ɪˈmjuːtəbl]
adj.
不变的;不可改变的;
例句
They free our minds from considering our world as fixed and immutable.
它们改变着人们将世界看作是永恒不变的观点。

在这里插入图片描述

SimpleDateFormat 非线程安全

例子代码

 static void test1(){SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");for (int i = 0; i < 10; i++) {new Thread(()->{try {Date date = dateFormat.parse("1999-09-09");System.out.println(date);}catch (Exception e){e.printStackTrace();}}).start();}
}

有线程会报错如下
在这里插入图片描述

可以synchronized解决,但效率低

static void test2(){SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");for (int i = 0; i < 10; i++) {new Thread(()->{synchronized (dateFormat) {try {Date date = dateFormat.parse("1999-09-09");System.out.println(date);} catch (Exception e) {e.printStackTrace();}}}).start();}
}

DateTimeFormatter 线程安全

static void test3() {DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");for (int i = 0; i < 10; i++) {new Thread(() -> {try {LocalDateTime dateTime = LocalDateTime.parse("2023-01-01 12:00:00", dateTimeFormatter);System.out.println(dateTime);} catch (Exception e) {e.printStackTrace();}}).start();}
}

线程安全原理

首先DateTimeFormatter是个final class, 这样所有线程都能使用它,不会有线程安全问题
在这里插入图片描述

另外:java.time.format.DateTimeFormatter#parseResolved0,也是将输入的format字符串也修饰成final的
在这里插入图片描述

其它不可变设计模式例子

Java String类为什么是final的?
  • value,offset和count这三个变量都是private的,并且没有提供setValue, setOffset和setCount等公共方法来修改这些值,所以在String类的外部无法修改String
  1. 为了实现字符串池

字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是可变的,那么String intern将不能实现,因为这样的话,如果变量改变了它的值,那么其它指向这个值的变量的值也会一起改变

  1. 为了安全 & 线程安全

final不可变,确保线程安全

  1. 为了实现String可以创建HashCode不可变性,提高效率

因为字符串是不可变的,所以在它创建的时候HashCode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串。

但也要注意到问题: 对象会创建的比较多,即占用内存会多


http://www.ppmy.cn/server/164857.html

相关文章

wire单总线通信

概述: 1-Wire技术由美国Dallas Semiconductor公司于1989年首次推出&#xff0c;最初的1-Wire标准主要用于便携数据传输模块&#xff0c;减少了设备之间的连接复杂性。 1-Wire单总线的核心特点 单线通信&#xff1a; 1-Wire协议通过一根信号线实现数据和时钟的双向传输&…

Linux网络 HTTPS 协议原理

概念 HTTPS 也是一个应用层协议&#xff0c;不过 是在 HTTP 协议的基础上引入了一个加密层。因为 HTTP的内容是明文传输的&#xff0c;明文数据会经过路由器、wifi 热点、通信服务运营商、代理服务器等多个物理节点&#xff0c;如果信息在传输过程中被劫持&#xff0c;传输的…

QT+mysql+python 效果:

# This Python file uses the following encoding: utf-8 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QMessageBox from PySide6.QtGui import QStandardItemModel, QStandardItem # 导入需要的类# Important: # 你需要通过以下指令把 form.ui转为ui…

Prompt提示词完整案例:让chatGPT成为“书单推荐”的高手

大家好&#xff0c;我是老六哥&#xff0c;我正在共享使用AI提高工作效率的技巧。欢迎关注我&#xff0c;共同提高使用AI的技能&#xff0c;让AI成功你的个人助理。 许多人可能会跟老六哥一样&#xff0c;有过这样的体验&#xff1a;当我们遇到一个能力出众或对事物有独到见解的…

游戏引擎 Unity - Unity 设置为简体中文、Unity 创建项目

Unity Unity 首次发布于 2005 年&#xff0c;属于 Unity Technologies Unity 使用的开发技术有&#xff1a;C# Unity 的适用平台&#xff1a;PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域&#xff1a;开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…

Debezium Oracle Connector SCN处理优化指南

Debezium Oracle Connector SCN处理优化指南 📌 问题场景 SCN跳跃场景: 起始SCN:15,000(含数据变更)结束SCN:1,000,000(无中间数据)默认批次大小:10,000 → 需执行985次无效查询🚀 优化方案 1. 自适应批次调整 代码位置:LogMinerStreamingChangeEventSource.j…

简单安全策略实验

一.实验准备 1.实验要求 2.实验拓扑图 3.进行交互配置 二.配置需求 开启设备在交换机上进行基础配置&#xff08;1&#xff09;让同一区间可以ping通 划分vlan并放通vlan 配置左侧设备 进入防火墙打开web服务 配置防火墙ip 配置前&#xff1a; 配置后&#xff1a; 按要求做实…

国土安全保障利器,高速巡飞无人机技术详解

高速巡飞无人机作为国土安全保障的利器&#xff0c;其技术特性和应用价值不可小觑。以下是对高速巡飞无人机技术的详细解析&#xff1a; 一、技术原理与关键组件 高速巡飞无人机的工作原理基于先进的飞行控制系统和制导技术。其核心组件主要包括&#xff1a; 1. 动力系统&…