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. 使用allparis正交法,生成测试用例

    原文:https://www.csdn.net/tags/MtzaggysODU0NTItYmxvZwO0O0OO0O0O.html 介绍工具前先讲下理论知识正交法一般适用于多个输入条件且条件与条件之 ...

  2. hdu4135题解 容斥

    Problem Description Given a number N, you are asked to count the number of integers between A and B ...

  3. 开发工具-eclipse/idea 在运行前执行一些动作

    毫无疑问,我们有的时候想在运行/编译程序前后执行一些动作.eclipse和idea都能支持. 日前正好遇到一个问题:有个依赖于pom的某个jar,内容虽然变了,但是版本不变,所以希望每次执行前先清除特 ...

  4. UE4打包发布后,在Windows和Android平台上访问非Asset文件

    1.问题来源 最近的项目里面有个需求,要在打包之后的exe或者apk运行起来后访问工程Content或者安卓目录下的非Asset文件,比如text文件,json文件等,从中读取一些可随时修改的配置项信 ...

  5. 3568F-系统启动阶段LOGO显示

  6. Docker使用Dockerfile部署项目

    什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档.可以使用在命令行中调用任何命令. Docker通过读取Dockerfile中的指令自动生成镜像. 如何通过do ...

  7. Blazor Server App Cannot find the fallback endpoint specified by route values

    github官方issues中提到的解决方案,CreateBuilder时指定项目绝对路径可以解决. 1 // 指定项目路径,也可以用Assembly.GetCallingAssembly获取 2 c ...

  8. Mac mysql 5.7.x 设置服务开机自启动

    在终端输入 sudo vi /Library/LaunchDaemons/com.mysql.mysql.plist 输入以下内容 <?xml version="1.0" e ...

  9. Intellij IDEA 'Error:java: 无效的源发行版:13'

    第一步,依次点击,File - Settings - Bulid, Execution,Deployment - Compiler - Java Compiler,修改版本为13(你使用的java是哪 ...

  10. 基于 Impala 的高性能数仓建设实践之虚拟数仓

    导读:本文主要介绍网易数帆 NDH 在 Impala 上实现的虚拟数仓特性,包括资源分组.水平扩展.混合分组和分时复用等功能,可以灵活配置集群资源.均衡节点负载.提高查询并发,并充分利用节点资源. 接 ...