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. JVM垃圾回收器与调优参数

    引言 JVM为了更有效率的对堆空间进行垃圾回收,把堆空间进行了分代,分为年轻代.老年代和永久代(在1.8版本以后,永久代已经被彻底移除了,被元空间取而代之). 当一个对象出生时,会首先选择在eden区 ...

  2. Woothosting 6$/年 vps测评

    当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解 Woothosting 6$/年 vps测评** 日期:2018-7- ...

  3. DELL服务器安装racadm检测服务器硬件状态

    1.下载racadm命令 For Linux 7及以上版本: https://dl.dell.com/FOLDER07423496M/1/DellEMC-iDRACTools-Web-LX-10.1. ...

  4. ENSP的VirtualBox虚拟网卡不能用

    VirtualBox 安装好后本地会新建一个名为 "VirtualBox Host-Only Network" 的虚拟网卡,虚拟机可以通过这个虚拟网卡网卡和物理机通信.但ENSP有 ...

  5. 算法金 | 决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost 算法大全

    大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 决策树是一种简单直观的机器学习算法,它广泛应用于分类和回归问题中.它的核心思想是将复杂 ...

  6. python重拾第八天-Socket网络编程

    本节内容 Socket介绍 Socket参数介绍 基本Socket实例 Socket实现多连接处理 通过Socket实现简单SSH 通过Socket实现文件传送 作业:开发一个支持多用户在线的FTP程 ...

  7. sql-labs通关笔记(上)

    sql-labs通关笔记(上) 这里我们先只讲解less-1到less-9 联合查询注入 Less-1:GET -Error based.Single quotes -string 界面 在url中加 ...

  8. php常用缓存逻辑

    代码 //行为限频 if (!function_exists('doSomethingLimit')) { function doSomethingLimit($key, $second, Closu ...

  9. 全国产!全志T3+Logos FPGA开发板(4核ARM Cortex-A7)规格书

    评估板简介 创龙科技TLT3F-EVM是一款基于全志科技T3四核ARM Cortex-A7 + 紫光同创Logos PGL25G/PGL50G FPGA设计的异构多核国产工业评估板,ARM Corte ...

  10. java 编程思想--个人总结

    从应用开始思考----思考解题思路--将思路分解成一步一步的步骤-----根据每一步的步骤思考如何用代码实现-- -- 不要心急,可以一块一块来完成-- 最后再思考如何用代码实现每两块之间的连接--- ...