线程安全与线程兼容与对立
线程安全与线程兼容与对立
线程安全
1. 实现 Java的线程安全
1.1. 不可变
我们知道 String , 是个常量类
final修饰, public final a = 100;
java.lang.String, String s = "string";
枚举类型, public enum Color{RED, GREEN, BLANK, YELLOW}
java.lang.Number的子类 如 Long, Double
BigInteger, BigDecimal(数值类型的高精度实现)
都属于不可变的对象
1.2. 绝对线程安全
满足咋 Brian Goetz 咋 Java Concurrency in Practice 中的定义的 线程为 绝对线程安全的
java api中标注的 自己是 线程安全的类, 绝大部分不是 绝对线程安全的, 如, java.util.Vector
我们需要在外面加一些 同步的操作
1.3. 相对线程安全
通常意义上上的 线程安全, 需要保证 这个对象 单独操作是 线程安全
运行过程中, 出现 数组下标越界错误
改进VectorSafe
Thread removeThread = new Thread(new Runnable(){
public void run() {
// 加上同步机制
synchronized(vector) {
for(int i = 0; i < vector.size(); i++) {
vector.remove(i);
}
}
}
});
Thread printThread = new Thread(new Runnable() {
public void run() {
// 加上同步机制
synchronized(vector) {
for(int i = 0; i < vector.size(); i++) {
System.out.println(vector.get(i));
}
}
}
});
加上 synchronized, 可以有效改善这些问题
1.4. 线程兼容与对立
线程兼容: 对象本身不是 线程安全的, 但是可以通过在 调用端 正确地使用 同步手段 来保证 对象在 并发环境中 可以 安全使用
线程对立: 无论调用端 是否 采取了 同步措施, 都无法在 多线程环境中 并发使用的代码
Java中线程对立的例子
Thread类的 suspend() 和 resume()方法 可能导致 死锁.
所以jdk已对其声明废弃(@Deprecated)
参考链接
https://www.xuetangx.com/learn/THU08091000252/THU08091000252/7754101/video/12732937
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律