当前位置:网站首页>多线程之享元模式和final原理
多线程之享元模式和final原理
2022-08-10 00:44:00 【七国的天下,我要九十九】
1 享元模式
1 定义
享元模式,Flyweight pattern, 当需要重用数量有限的同一类对象时使用.
2 体现
1 包装类
Jdk中Boolean, Byte, Short, Integer, Long, Character等包装类提供了valueOf方法.以Long的valueOf为例, 会缓存-128到127之间的Long对象,在此区间会重用对象,大于这个范围才会新建Long对象.
public static Long valueOf(long l) {
final int offset = 128;
if (l >= -128 && l <= 127) {
// will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}
Byte,Short, Long缓存的范围都是-128到127
Character缓存的范围是0-127
Integer的默认范围是-128到127, 最小值不能变,最大值可以通过调整虚拟机参数
-Djava.lang.Integer.IntegerCache.high来改变Boolean缓存了TRUE和FALSE
2 BigDecimal类
private static BigDecimal add(BigInteger fst, int scale1, BigInteger snd, int scale2) {
int rscale = scale1;
long sdiff = (long)rscale - scale2;
if (sdiff != 0) {
if (sdiff < 0) {
int raise = checkScale(fst,-sdiff);
rscale = scale2;
fst = bigMultiplyPowerTen(fst,raise);
} else {
int raise = checkScale(snd,sdiff);
snd = bigMultiplyPowerTen(snd,raise);
}
}
BigInteger sum = fst.add(snd);
return (fst.signum == snd.signum) ?
new BigDecimal(sum, INFLATED, rscale, 0) :
valueOf(sum, rscale, 0);
}
单个方法是采用保护性拷贝类方式, 是原子的,线程安全的, 但是不能保证多个方法的组合是原子的,线程安全的,所以在使用中,需要其他方法保证,如使用AtomicReference.
2 final原理
1 设置final的原理
根据之前volatile原理,对比final的实现.
public class TestFinal {
final int a = 20;
}
对应字节码文件:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: bipush 20
7: putfield #2 // Field a:I
<-- 添加了写屏障
10: return
发现 final 变量的赋值也会通过 putfield 指令来完成,同样在这条指令之后也会加入写屏障,保证在其它线程读到 它的值时不会出现为 0 的情况
2 获取final的原理
public class TestFinal {
final int A = 20;
final int B = Short.MAX_VALUE + 1;
static final int a = 20;
static final int b = Short.MAX_VALUE + 1;
}
根据编译的字节码文件可知, 当数据较小就在栈内存中获取,数据量超过最大,就在类常量池中.
3 无状态
在 web 中,设计 Servlet 时为了保证其线程安全,都会有这样的建议,不要为 Servlet 设置成员变量,这种没有任何成员变量的类是线程安全的
因为成员变量保存的数据也可以称为状态信息,因此没有成员变量就称之为【无状态】
边栏推荐
- 高校就业管理系统设计与实现
- 365 days challenge LeetCode1000 questions - Day 052 Step by step summation to get the minimum value of positive numbers Greedy
- 微信账户体系科普:什么是UnionId、OpenId与wxopenid?
- Characteristics of the (CAS:1527486-16-3TAMRA-azide-PEG3-Biotin) reaction in biotin azide!
- -红与黑-
- RedHat红帽RHEL7安装与使用,VMware Workstation16 Pro虚拟机的安装与使用
- 2022金九银十工作潮,怎么样才能成功跳槽面试拿到高薪呢?
- 鲜花线上销售管理系统的设计与实现
- ASEMI整流桥GBJ1010参数,GBJ1010规格,GBJ1010封装
- Minimum number of steps to get out of the maze 2
猜你喜欢

【CAS:41994-02-9 |Biotinyl tyramide】生物素基酪氨酰胺价格

UI遍历的初步尝试

Problems and solutions related to Chinese character set in file operations in ABAP

Web性能测试模型小结

Xi'an biotin-tetrapolyethylene glycol-amide-4phenol light yellow semi-solid

RedHat红帽RHEL7安装与使用,VMware Workstation16 Pro虚拟机的安装与使用

XSS高级 svg 复现一个循环问题以及两个循环问题

Involved in PEG-Biotin (CAS: 1778736-18-7) Biotin-PEG4-OH is widely used in molecular target detection

DHCP——动态主机配置协议

万字总结:分布式系统的38个知识点
随机推荐
SonarQube升级记录:7.8->7.9->8.9
GBJ1510-ASEMI机器人电源整流桥GBJ1510
C语言头文件组织与包含原则
【CAS:41994-02-9 |Biotinyl tyramide】生物素基酪氨酰胺价格
人际关系不仅要“存”,更要“激活”!
unity 报错 Unsafe code may only appear if compiling with /unsafe. Enable “Allow ‘unsafe‘ code“ in Pla
R语言使用glm函数构建逻辑回归模型(logistic)、使用subgroupAnalysis函数进行亚组分析并可视化森林图
微信小程序tab切换时保存checkbox状态
小程序实现搜索功能续
由生物素参与的D-Biotinol,CAS号:53906-36-8具体特性说明
头脑风暴:单词拆分
跨部门沟通的技巧
万字总结:分布式系统的38个知识点
GB28181 sip和RTSP(Real-Time Streaming Protocol)实时流控制协议
有PEG-Biotin参与的(CAS:1778736-18-7)Biotin-PEG4-OH广泛用于分子靶点检测
R语言使用cox函数构建生存分析回归模型、使用subgroupAnalysis进行亚组分析并可视化森林图
无js实现弹出层效果
What should I do if there is no sound after reinstalling the system in win10?
基于Web的疫情隔离区订餐系统
开发IM即时通讯容易吗?需要什么技术