java多线程之-不可变final
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的更多相关文章
- Java多线程——不可变对象
不可变对象条件 对象需要满足一下三个条件才是不可变对象: 1.对象创建以后其状态就不能修改 2.对象所有域都是final类型 3.对象是正确创建的(对象在创建期间,this引用没有溢出) 简而言之就是 ...
- 40个Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- Java多线程开发技巧
很多开发者谈到Java多线程开发,仅仅停留在new Thread(...).start()或直接使用Executor框架这个层面,对于线程的管理和控制却不够深入,通过读<Java并发编程实践&g ...
- Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList
概要 本章是"JUC系列"的CopyOnWriteArrayList篇.接下来,会先对CopyOnWriteArrayList进行基本介绍,然后再说明它的原理,接着通过代码去分析, ...
- Java多线程系列--“JUC集合”03之 CopyOnWriteArraySet
概要 本章是JUC系列中的CopyOnWriteArraySet篇.接下来,会先对CopyOnWriteArraySet进行基本介绍,然后再说明它的原理,接着通过代码去分析,最后通过示例更进一步的了解 ...
- Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- Java多线程---同步与锁
一,线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 二.同步和锁定 1.锁的原理 Java中每个对象都有一个内置锁. 当程序运行到非静态的synchronized同步方法上时,自动 ...
- JAVA 多线程编程之一(基础)
1.原子变量(java.util.concurrent.atomic) 原子状态,变化不会被打断,如 AtomicLong , AtomicInteger 2.内部锁 synchronized 块 ...
- Java多线程编程详解
转自:http://programming.iteye.com/blog/158568 线程的同步 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Ja ...
- Java 多线程 并发编程
一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的:进程拥有各种 ...
随机推荐
- 前端开发环境配置 nvm | npm 镜像 | git
安装 nvm nvm 是一个node版本管理工具,它可以让我们安装多个node版本并在需要的时候切换 # nvm 下载地址 https://github.com/coreybutler/nvm-win ...
- 实验7.Vlan划分实验
# 实验7.Vlan划分实验 本实验用于划分Vlan,并对划分的Vlan做隔离测试. 实验组 拓扑 Vlan隔离配置 在配置vlan前,测试PC1234互通 具体配置vlan 这里给出其中一台交换机的 ...
- .NET中使用RabbitMQ延时队列和死信队列
RabbitMQ延时队列和死信队列 延时队列和死信队列 延时队列是RabbitMQ中的一种特殊队列,它可以在消息到达队列后延迟一段时间再被消费. 延时队列的实现原理是通过使用消息的过期时间和死信队列来 ...
- 使用Scrcpy 在电脑显示手机画面并控制安卓设备
使用Scrcpy 显示手机画面并控制手机 原文(有删改):https://www.iplaysoft.com/scrcpy.html 背景 本文适用于安卓开发人员,不针对普通安卓手机用户. 在安卓开发 ...
- 高通SOC启动流程
背景 开始接手高通开发的有关工作,为了调试底层驱动,因此有必要了解高通平台上电启动的流程是怎么样的. 以 MSM8953 为例子. MSM:mobile station modems,移动基带处理器, ...
- HTTP 协议学习:1-HTTP概述
背景 原文:HTTP概述 HTTP是一种能够获取如 HTML 这样的网络资源的 protocol(通讯协议).它是在 Web 上进行数据交换的基础,是一种 client-server 协议,也就是说, ...
- vba--分拆工作薄
Sub 分拆工作薄() '分拆工作薄到当前文件夹 Dim sht As Worksheet Dim MyBook As Workbook Application.DisplayAlerts = Fal ...
- InvocationTargetException和UndeclaredThrowableException异常介绍
今天来介绍了两个陌生又熟悉的异常类,熟悉是因为我们经常会遇到它们,陌生是好像又从来不知道它们是做什么的 假定读者已经清楚了Java的异常分类: 一是程序不能处理的错误(Error), 二是程序应该避免 ...
- c语言之位段
百度百科链接 示例: 1 struct CHAR 2 { 3 unsigned int ch : 8; //8位 4 unsigned int font : 6; //6位 5 unsigned in ...
- 如何用python计算不定积分
在Python中,计算不定积分(即原函数或反导数)可以通过SymPy库实现.SymPy是一个用于符号数学的Python库,支持许多类型的数学对象,包括整数.有理数.实数.复数.函数.极限.积分.微分. ...