一些容易错的点、黑体重要的点。
编程规范5.0黑体
- 启动安全管理器
- 启动参数:
-Djava.security.manager
- 代码启动:
System.setSecurityManager(new SecurityManager());
- 启动参数:
- String str = “1” + “2” + “3” + “4” 一共创建几个对象:
1个
- 求平方根方法public static double sqrt (double fst)可以传递的参数类型有哪些
long,float,byte
- 内存中敏感信息使用完毕立即清0。为了方便清理,推荐优先使用
byte[]/char[]
存储敏感信息 - 整数包装类型应该使用
equals()
方法做相等比较,可以使用compareTo(another)
做大小比较。不推荐使用==做相等比较 - 禁止对Optional对象赋值/返回为null,或与null比较。
- 覆写 --子类父类间 (子类把父类相同名字方法覆写了)
重载 – 类内部 (方法名字相同签名不同)
隐藏 – 子类与父类间 (类的属性、静态方法、内部类被父类相同名字的对象遮住了,隐藏着了)
遮蔽 --类内部 (变量方法类 相同名字遮蔽了)
遮掩 – 类内部 (变量或者类型遮掩一个包) - data race:两个线程分别对一个非volatile的共享变量进行访问操作,其中至少一个操作是写操作,且这两个操作之间没有happens-before关系。
- 是否正确同步的标准是”是否建立了happens-before关系“
- 选取合适的同步机制:首先考虑使用消息队列,或者其他java标准库中提供的高级同步机制。
- java中volatile变量的+=、-=、*=等复合赋值操作是
可以分割
的原子读改写操作,先读后写
- 一般来说,如果使用锁,那么
读和写都要加锁
,而不是写线程需要加锁,读线程不加锁。 - java中,双检锁需要用
volatile配合锁
共同实现同步才能正确实现。
- 对共享变量做同步访问控制时需避开同步陷阱
- 同步陷阱1:使用了基于高级并发对象的synchronize块。(使用锁应该都一样
synchronized lock
) - 同步陷阱2:使用实例锁来同步静态共享变量 。 (实例锁同步效果仅限于本身
counter
) - 同步陷阱3:使用可被重用的对象锁 (
”lock“
) - 同步陷阱4:使用class类对象锁 (
”someshareResource.class“
)
- 同步陷阱1:使用了基于高级并发对象的synchronize块。(使用锁应该都一样
- 如果一个线程让另一个线程终止执行,javaapi推荐方式为:
让被中止的线程在运行中周期性的查询自己是否被中止
,如果发现被中止,则应该主动清理状态并中止执行。- 不可以使用
非volatile变量
作为通知用的变量 - 慎用Thread.interrupt方法,他依赖执行线程对interrupter status的处理逻辑。
- 调用Thread.interupt()的线程希望当前线程尽快停止。
- 不可以使用
- 从ZipInputStream中解压文件必须进行安全检查。存在两类安全风险:
- 将文件解压到目标目录之外
- 解压的文件消耗过多的系统资源
- 从调用者角度来说,外部进程的输入流时OutputStream
- 禁止直接向Runtime.exec()方法或java.lang.ProcessBuilder类传递外部数据。常见注入场景:
- 外部数据
直接用于拼接shell方式
的命令行 - 外部数据用于
构造命令数组中的某个值
- 外部数据用于
.bat/.sh脚本中的参数
- 外部数据用于
构造非shell方式的命令行
- 外部数据
- 防止外部实体攻击
- 禁止解析DTDs
true false false
- 禁止解析外部一般实体和外部参数实体
false false false
- 对外部实体进行白名单校验
校验函数
- 禁止解析DTDs
- 防止内部实体扩展攻击
- 禁止解析DTDs
true false false
- 通过系统属性限制实体数量
System.setProperty()
- 限制实体数量
dbf.setAttribute()
- 禁止解析DTDs
2021.9.15错题整理
编程规范理解与应用:错误2道
调试与定位能力:错误1道
开发者测试: 错误1道
编程语言能力:错误18道
综合:
- 核心类库:反射、线程、集合与泛型
- JVM:运行时数据区、Class格式、JIT、GC、类加载
- 性能优化: JVM性能优化方法,性能相关