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

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

线程安全

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 2021-11-06 16:06  beyondx  阅读(158)  评论(0编辑  收藏  举报

导航