搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
Monodyee
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
socket编程一:socket是什么?套接字是什么?_socket编程 为什么是socket
2
Unity 3D脚本编程与游戏开发【3.7】
3
使用OpenCV检测ArUco码_aruco二维码
4
MySQL简单查询/多表查询/子查询/分组查询详细讲解_from 后面跟多个表不加逗号
5
Golang函数_golang 定义函数
6
CleanMyMac X详细测评 CleanMyMac X常见问题 CleanMyMac X有必要买吗 cleanmymac和腾讯柠檬哪个好
7
C++重载[](下标运算符)详解
8
华为HCIP-AI认证题库中的部分问题(1),2024最新Python高频精选面试题分享_hcip-ai题目神经网络及其python实现
9
TCP的连接和断开详解_tcp连接
10
修改gitlab 去掉双重认证 Two-Factor Authentication_关闭git 2fa 双重认证
当前位置:
article
> 正文
Java线程安全_substring是线程安全吗
作者:Monodyee | 2024-05-31 03:38:12
赞
踩
substring是线程安全吗
1.
线程安全
首先介绍一下Java语言中各种操作共享的数据,具体可分为以下5类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。
不可变
“不可变”带来的安全性是最简单和最纯粹的。在Java中,如果一个共享数据是
基本数据类型
,那么只要在定义时使用
final
关键字修饰就可以保证它是不可变的。如果共享数据是一个
对象
,那就需要
保证对象的行为不会对其状态产生任何影响
,比如String类的对象,它就是一个典型的不可变对象,调用它的substring()、replace()和concat()方法时不会影响原来的值,只会返回一个新构造的字符串。最简单保证对象行为不影响自己状态的方法就是把带状态的变量声明为final。
注:同为Number的子类型的原子类AtomicInteger和AtomicLong是可变的。
绝对线程安全
绝对的线程安全指的是满足“不管运行时环境如何,调用者都不用任何额外的同步措施”,在JavaAPI中标注自己是线程安全的类大多都不是绝对的线程安全。
相对线程安全
相对的线程安全就是通常意义上的线程安全,它需要保证对该对象单独的操作是线程安全的,在调用时不需要额外的保障措施,但对于一些特定顺序的连续调用就可能在调用端使用额外的同步手段保证调用的正确性。
线程兼容
线程兼容指对象本身不是线程安全的,但可以通过在调用端正确使用同步手段保证对象在并发环境中可以安全的使用。
线程对立
指无论调用端是否采取了同步措施,都无法在多线程环境中并发使用的代码, 应尽量避免这种代码的出现。
2.线程安全的实现方法
互斥同步
同步是指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一个(或者是一些,使用信号量的时候)线程使用。
互斥是实现同步的一种手段,临界区、互斥量、信号量都是主要的互斥实现方式。因此,
互斥是因,同步是果;互斥是方法,同步是目的。
最基本的互斥同步手段就是
synchronized
关键字,synchronized关键字经过编译后会在同步块前后分别形成monitorenter和monitorexit两个字节码指令,这两个字节码指令都需要一个reference类型的参数指明要锁定和解锁的对象。
另外可以使用
同步锁
实现同步,也具备
线程重入特性
,另外增加了
等待可中断、可实现公平锁以及锁可绑定多个条件
。
等待可中断指当前持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情,可中断特性对处理执行时间非常长的同步块很有帮助。
公平锁指多个线程在等待同一个锁时,必须按照申请锁的时间顺序依次获得锁;synchronized中的锁时非公平的,同步锁默认也是非公平的,但可以通过带布尔值的构造参数要求使用同步锁。
锁绑定多个条件是指一个ReentrantLock对象可以同时绑定多个Condition对象。
注:优先考虑使用synchronized进行同步。
非阻塞同步
从处理问题的方式上说,互斥同步属于一种
悲观的并发策略
。随着硬件指令集的发展,我们可以选择基于冲突检测的乐观并发策略,通俗的说,就是先进行操作,如果没有其他线程争用共享数据,那就操作成功;如果有争用,产生了冲突,那就再采取其他的补偿措施,这种乐观的并发策略的许多实现都不需要把线程挂起,也被称为非阻塞同步。
使用乐观并发策略需要
操作和冲突检测具备原子性
,硬件保证一个从语义上看起来需要多次操作的行为只通过一条处理器指令就能完成,常用指令有:
测试并设置(Test-and-Set)、获取并增加(Fetch-and-Increment)、交换(Swap)、比较并交换(Compare-ans-Swap)、加载链接/条件存储(LL/SC)
。
无同步方案
保证线程安全并不是一定要进行同步,例如一个方法没有涉及共享数据,那就无须任何同步措施去保证正确性,有一些代码天生就是线程安全的。
可重入代码:也叫纯代码,可以在执行的任何时刻中断,转而去执行另外一段代码,在控制权返回后原来的程序不会出现任何错误。
线程本地存储:如果一段代码中所需要的数据必须与其他代码共享,那就保证这些共享数据的代码在同一个线程中执行。
3.锁优化
自旋锁和自适应自旋
物理机器上有一个以上的处理器,能让两个或以上的线程同时并行执行,就可以让后面请求锁的线程“稍等一下”,但不放弃处理器的执行时间,看看持有锁的线程是否很快就会释放锁。为了让线程等待,我们只需让线程执行一个忙循环(自旋),这就是自旋锁。
自旋等待的时间必须要有一定限度。
自适应指的是自旋的时间不再固定,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。
锁消除
锁消除是指虚拟机即时编译器在运行时,对一些代码要求同步,但是被检测到不可能存在共享数据的锁进行消除。锁消除的主要依据来源于逃逸分析的数据支持。
锁粗化
在频繁的互斥操作导致不必要的性能损耗是,把加锁范围扩展(粗化)到整个序列的外部。
轻量级锁
偏向锁
引入目的是消除数据在无竞争情况下的同步原语,进一步提高程序的运行性能。偏向锁指的就是这个锁会偏向于第一个获得它的线程,如果在接下来的执行过程中,该锁没有被其他线程获取,则持有偏向锁的线程将永远不需要再进行同步。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/Monodyee/article/detail/650158
推荐阅读
article
java
.
lang
.ArrayIndexOutOfBoundsException...
java
.
lang
.ArrayIndexOutOfBoundsException is a runtime except...
赞
踩
article
报错:
java
.
lang
.
ArrayIndexOutOfBoundsException
——
数组
越界_...
题目:给定一个排序
数组
,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后
数组
的新长度。不要使用额外的数...
赞
踩
article
【
JAVA
】
双向
链表
详解_
java
双向
链表
...
LinkedList的底层是
双向
链表
结构(
链表
后面介绍),由于
链表
没有将元素存储在连续的空间中,元素存储在单独的节点中,...
赞
踩
article
Java
——
正则表达式
...
①Pattern类为
正则表达式
的编译表现形式②Matcher类为Pattern对Character sequence(文...
赞
踩
article
【
Java
】
实现
冒泡排序
讲解_
java
实现
冒泡排序
...
Java
实现
冒泡排序
_
java
实现
冒泡排序
java
实现
冒泡排序
目录
冒泡排序
冒泡排序
思路 示...
赞
踩
article
JAVA
几种
排序
算法
(附)
动画
演示_
java
冒泡
算法
动画
...
几种
排序
算法
的属性对比一、
冒泡
排序
特点:效率低,实现简单 原理:将待
排序
列中最大的数往后
冒泡
,成为新的序列,重复以上...
赞
踩
article
2024OD
机试卷-螺旋
数字
矩阵
(
java
\
python
\
c++
)_
疫情
期间
,
小明
隔离在家
,
百无聊...
疫情
期间,
小明
隔离在家,
百无聊赖
,在纸上
写
数字
玩。他发明了一种
写
法:给出
数字
个数 n (0 < n ≤ 999)和行数 ...
赞
踩
article
华为
OD
机试C
、
D卷 - 螺旋
数字
矩阵
(
Java
& JS &
Python
& C & C++)_...
## 题目描述疫情期间,小明隔离在家,百无聊赖,在纸上写
数字
玩。他发明了一种写法:给出
数字
个数 n (0 < n ≤ 9...
赞
踩
article
Java
kafka
producer
的常用
参数
的意义
说明
及
默认值
_
acks
=0...
生产端核心
参数
1.
acks
参数
说明
:这是一个非常重要的
参数
,表示指定分区中成功写入消息的副本数量,这是Kafka生产端...
赞
踩
article
华为OD机试 -
螺旋
矩阵
II(
java
&
c
++&
python
&
java
s
c
ript & g...
华为OD机试 -
螺旋
矩阵
II(
java
&
c
++&
python
&
java
s
c
ript &
golang
&
c
#...
赞
踩
article
华为OD机试 -
螺旋
矩阵
(
java
& c++&
python
&
java
script & gola...
华为OD机试 -
螺旋
矩阵
(
java
& c++&
python
&
java
script &
golang
& c# & ...
赞
踩
article
Java
web
应用
性能
分析之【
性能
点概叙】
_
java
web
如何
统计
性能
...
在
性能
问题排查过程中,我们依赖的就是监控,实时监控和历史监控,要么通过监控工具,查某段时间内服务器资源消耗情况,结合业务...
赞
踩
article
java
- JVM
CPU100%
,
问题
排查
_
java
接口
压力测试
cpu100%
...
前段时间我们新上了一个新的应用,因为流量一直不大,集群QPS大概只有5左右,写
接口
的rt在30ms左右。因为最近接入了新...
赞
踩
article
java
cpu
过高
排查
_利用
Arthas
精准定位
Java
应用
CPU
负载过高
问题
...
转自:有赞coder作者:张云翔最近我们线上有个应用服务器有点上头,
CPU
总能跑到99%,我寻思着它流量也不大啊,为啥能...
赞
踩
article
「秘籍」
JAVA
求职
面试
宝典,轻松吊打
面试
官,拿下大厂offer_
招聘
软件
怎么
打招呼模板
java
...
又到了一年
求职
季,有粉丝找小编咨询小编收集了些
面试
相关应对技巧分享给大家
面试
好比就像是场约会你是不是常常担心自己没有表现...
赞
踩
article
Java
程序员
必备基础
知识
温故而知新_
java
程序员
必备
知识
...
前言正文自我介绍数据结构和算法
Java
篇
Java
EE
知识
点储备计算机网络操作系统数据库相关XML常识性
知识
总结前言准备...
赞
踩
article
java
保留
2
位小数_
string
.
format
%.
2
丢精度...
java
保留
2
位小数, 计算同比环比_
string
.
format
%.
2
丢精度
string
.
format
%.
2
丢精度...
赞
踩
article
Java
• 保留
2
位小数(
1
、
String
.
format
(“
%.
2
f“,
参数
),
参数
的
数据类型
是d...
Java
• 保留
2
位小数(
1
、
String
.
format
("
%.
2
f",
参数
),
参数
的
数据类型
是
double
;
2
、例如...
赞
踩
article
Java
学习
(一)
Java
语言
基础_
java
学习
...
初学
Java
的编程小白的自学法宝,
Java
语言
基础带您走近
Java
世界。_
java
学习
java
学习
...
赞
踩
article
java
输出
保留
小数点
后
2
位_运行结果
输出
为
小数点
后
二位
web
...
在函数中返回值以double的类型返回,最
后
打印的时候利用:System.out.printf("%.
2
f ",rs);...
赞
踩
相关标签
java
python
jvm
多线程
编程语言
程序报错
链表
数据结构
正则表达式
intellij-idea
程序人生
c++
矩阵
od
od机试
开发语言
华为od
c语言
javascript
kafka
分布式
大数据