1.背景

final这个关键字相信大家不陌生吧...

看看下面的案例

2.时间格式化之线程不安全SimpleDateFormat

package com.ldp.demo08final;

import lombok.extern.slf4j.Slf4j;

import java.text.ParseException;
import java.text.SimpleDateFormat; /**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 02/19 7:37
* @description
*/
@Slf4j
public class Test01SimpleDateFormat {
/**
* 在并发的情况下可能会抛出如下异常:
* Exception in thread "t-3" java.lang.NumberFormatException: For input string: ""
* at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
* at java.lang.Long.parseLong(Long.java:601)
* at java.lang.Long.parseLong(Long.java:631)
* at java.text.DigitList.getLong(DigitList.java:195)
* at java.text.DecimalFormat.parse(DecimalFormat.java:2051)
* at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1869)
* at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514)
* at java.text.DateFormat.parse(DateFormat.java:364)
* at com.ldp.demo08final.Test01Time.lambda$main$0(Test01Time.java:22)
* at java.lang.Thread.run(Thread.java:748)
*
* @param args
*/
public static void main(String[] args) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
for (int i = 0; i < 20; i++) {
new Thread(() -> {
try {
log.info("日期为:{}", format.parse("2022-02-02"));
} catch (ParseException e) {
e.printStackTrace();
}
}, "t-" + i).start();
}
}
}

3.时间格式化之加锁实现线程安全

package com.ldp.demo08final;

import lombok.extern.slf4j.Slf4j;

import java.text.ParseException;
import java.text.SimpleDateFormat; /**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 02/19 7:37
* @description *
* <p>
* 在并发的情况下可能会抛出如下异常:
* Exception in thread "t-3" java.lang.NumberFormatException: For input string: ""
* 解决方案:
* 1.加锁
* 2.不可变的思维
* </p>
*/
@Slf4j
public class Test02SimpleDateFormat {
/**
* 加锁synchronized 的方式解决并发问题
*
* @param args
*/
public static void main(String[] args) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
for (int i = 0; i < 20; i++) {
new Thread(() -> {
synchronized (format) {
try {
log.info("日期为:{}", format.parse("2022-02-02"));
} catch (ParseException e) {
e.printStackTrace();
}
}
}, "t-" + i).start();
}
}
}

4.时间格式化之DateTimeFormatter线程安全

package com.ldp.demo08final;

import lombok.extern.slf4j.Slf4j;

import java.time.format.DateTimeFormatter;

/**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 02/19 7:49
* @description
*/
@Slf4j
public class Test03DateTimeFormatter {
/**
* 不可变的特性解决并发情况下的线程安全问题
*
* @param args
*/
public static void main(String[] args) {
// @since 1.8
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd");
for (int i = 0; i < 20; i++) {
new Thread(() -> {
try {
log.info("日期为:{}", format.parse("2022-02-02"));
} catch (Exception e) {
e.printStackTrace();
}
}, "t-" + i).start();
}
}
}

5.String对象中使用源码的理解

package com.ldp.demo08final;

import org.junit.Test;

/**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 02/19 7:59
* @description <p>
* 这一节我们来看看String源码
* 1.final 关键字
* 发现String类、类中所有属性多是 final 的
* 属性用 final 修饰保证了该属性是只读的,不能修改
* 类用 final 修饰保证了该类中的方法不能被覆盖,防止子类无意间破坏不可变性
* <p>
* 2.substring方法保护性拷贝
*
* </p>
*/
public class Test04String {
private String name = "final"; /**
* public String substring(int beginIndex) {
* if (beginIndex < 0) {
* throw new StringIndexOutOfBoundsException(beginIndex);
* }
* int subLen = value.length - beginIndex;
* if (subLen < 0) {
* throw new StringIndexOutOfBoundsException(subLen);
* }
* return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
* }
*/
@Test
public void test01Substring() {
String substring = name.substring(2);
System.out.println(substring);
}
}

完美!

java多线程之-不可变final的更多相关文章

  1. Java多线程——不可变对象

    不可变对象条件 对象需要满足一下三个条件才是不可变对象: 1.对象创建以后其状态就不能修改 2.对象所有域都是final类型 3.对象是正确创建的(对象在创建期间,this引用没有溢出) 简而言之就是 ...

  2. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  3. Java多线程开发技巧

    很多开发者谈到Java多线程开发,仅仅停留在new Thread(...).start()或直接使用Executor框架这个层面,对于线程的管理和控制却不够深入,通过读<Java并发编程实践&g ...

  4. Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList

    概要 本章是"JUC系列"的CopyOnWriteArrayList篇.接下来,会先对CopyOnWriteArrayList进行基本介绍,然后再说明它的原理,接着通过代码去分析, ...

  5. Java多线程系列--“JUC集合”03之 CopyOnWriteArraySet

    概要 本章是JUC系列中的CopyOnWriteArraySet篇.接下来,会先对CopyOnWriteArraySet进行基本介绍,然后再说明它的原理,接着通过代码去分析,最后通过示例更进一步的了解 ...

  6. Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  7. Java多线程---同步与锁

    一,线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 二.同步和锁定 1.锁的原理 Java中每个对象都有一个内置锁. 当程序运行到非静态的synchronized同步方法上时,自动 ...

  8. JAVA 多线程编程之一(基础)

    1.原子变量(java.util.concurrent.atomic) 原子状态,变化不会被打断,如 AtomicLong , AtomicInteger 2.内部锁  synchronized 块 ...

  9. Java多线程编程详解

    转自:http://programming.iteye.com/blog/158568 线程的同步 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Ja ...

  10. Java 多线程 并发编程

    一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的:进程拥有各种 ...

随机推荐

  1. FinalReference 如何使 GC 过程变得拖拖拉拉

    本文基于 OpenJDK17 进行讨论,垃圾回收器为 ZGC. 提示: 为了方便大家索引,特将在上篇文章 <以 ZGC 为例,谈一谈 JVM 是如何实现 Reference 语义的> 中讨 ...

  2. 【长文】带你搞明白Redis

    本文使用第一人称来介绍Redis 一.概述 Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化 ...

  3. Grab 基于 Apache Hudi 实现近乎实时的数据分析

    介绍 在数据处理领域,数据分析师在数据湖上运行其即席查询.数据湖充当分析和生产环境之间的接口,可防止下游查询影响上游数据引入管道.为了确保数据湖中的数据处理效率,选择合适的存储格式至关重要. Vani ...

  4. 如何在Spring Boot框架下实现高效的Excel服务端导入导出?

    前言 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置 ...

  5. FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作

    ​<FFmpeg开发实战:从零基础到短视频上线>一书的"3.4.3  把原始的H264文件封装为MP4格式"介绍了如何把H.264裸流封装为MP4文件.那么在网络上传输 ...

  6. 新品再袭,比RK3568J降本40%+,瑞芯微最新性价比工业平台-RK3562J

  7. DDP:微软提出动态detection head选择,适配计算资源有限场景 | CVPR 2022

    DPP能够对目标检测proposal进行非统一处理,根据proposal选择不同复杂度的算子,加速整体推理过程.从实验结果来看,效果非常不错 来源:晓飞的算法工程笔记 公众号 论文: Should A ...

  8. 新一代云原生日志架构 - Loggie的设计与实践

    Loggie萌芽于网易严选业务的实际需求,成长于严选与数帆的长期共建,持续发展于网易数帆与网易传媒.中国工商银行的紧密协作.广泛的生态,使得项目能够基于业务需求不断完善.成熟.目前已经开源:https ...

  9. iOS开发基础100 - MDM证书申请流程

    申请成为MDM Vendor 首先需要拥有一个 iOS Developer Enterprise Program 帐号; 申请成为MDM Vendor,iOS企业开发帐号默认不支持MDM功能,需要向苹 ...

  10. [oeasy]python0074_修改字体背景颜色_background_color_背景色

    修改背景色 回忆上次内容 上次将asciiart和颜色一起来玩 7 种基本色 变化多端 不过到目前为止 改的 都是前景色 背景色可以修改吗? 重温参数 具体动手试试 print("\033[ ...