线程安全与线程兼容与对立

线程安全与线程兼容与对立

线程安全

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

posted on   beyondx  阅读(168)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示