当前位置:网站首页>多线程之享元模式和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 设置成员变量,这种没有任何成员变量的类是线程安全的
因为成员变量保存的数据也可以称为状态信息,因此没有成员变量就称之为【无状态】
边栏推荐
猜你喜欢

Shader Graph学习各种特效案例

Solidity最强对手:MOVE语言及新公链崛起

win10重装系统后没声音怎么办?

小程序实现搜索功能续

Characteristics of the (CAS:1527486-16-3TAMRA-azide-PEG3-Biotin) reaction in biotin azide!

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

Aptos 深度解读:机遇、挑战与风险

unity编辑器扩展界面使用 List

CAS:183896-00-6 (Biotin-PEG3-C3-NH2) PEG衍生物

CAS:851113-28-5 (生物素-ahx-ahx-酪胺)
随机推荐
数据建模已死,真的吗?
Docker interview question 2--get the number of database connections and docker-compose
Solve the problem of sed replacement text containing special characters such as "/" and "#"
有PEG-Biotin参与的(CAS:1778736-18-7)Biotin-PEG4-OH广泛用于分子靶点检测
基于SSM实现手机销售商城系统
Pyscript,创建一个能执行crud操作的网页应用
【无标题】
Sikuli 基于图形识别的自动化测试技术
ABAP 里文件操作涉及到中文字符集的问题和解决方案
宝塔实测-搭建LightPicture开源图床系统
初步认识对象
Stanford CS143 Speed Pass PA1 Tutorial
unity编辑器扩展界面使用 List
信息化和数字化的核心差异
Not, even the volume of the king to write code in the company are copying and pasting it reasonable?
win10重装系统后没声音怎么办?
C语言头文件组织与包含原则
你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06
手把手教你编写性能测试用例
跳房子游戏