并发概念基础:线程安全与线程间通信

本文详细解析了Java中线程安全的五种级别:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。并列举了符合各安全级别的典型Java API类型,如String、Vector及线程类的suspen方法等。同时,介绍了实现线程安全的多种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程安全

按照线程安全的安全程度来分的话,java中的各种操作共享的数据主要分为5类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。

  • 不可变
    对于final关键字可见性来说,只要一个不可变对象被正确构建出来(没有this引用逃逸),那其外部的可见状态永远也不会改变。
    在java api中复核不可变要求的类型主要有:
    • String
    • 枚举类型
    • Long和Double等数值包装类型
    • BigInteger和BigDecimal等大数据类型
      但同在number包下的AtomicLong和AtomInteger等原子类并非是不可变的类型。
  • 绝对线程安全
    java中几乎没有
  • 相对线程安全
    这个就是我们通常意义所说的线程安全。
    它需要保证对这个对象单独的操作时线程安全的,我们在调用的时候不需要做额外的保障措施。但是对于一些特定顺序的连续调用,就可能需要在调用端使用额外的同步手段来保证调用的正确性。
    如vector,hashtable等线程安全类都是属于这种的。
  • 线程兼容
    线程兼容是指对象本身并不是线程安全的,但是可以通过在调用端正确使用同步手段来保证对象在并发环境中可以安全使用。
    java中的ArrayList和HashMap就是这种。
  • 线程对立
    指无论调用端是否采用同步措施,都无法在多线程环境中并发使用代码。
    一个例子就是Thread类的suspen方法和resume方法,如果有两个线程同时持有一个线程对象,一个去中断线程,一个去恢复线程,如果并发进行的话,无论调用是否采用了同步,都会存在锁死的风险。
    常见的线程对立例子还有:
    System.setIn()
    System.setOut()
    System.runFinalizersOnExit()

线程安全的实现方法

参考并发等级

线程间通信

https://www.cnblogs.com/yangdagaoge/articles/9685023.html

volatile和synchronized
wait/notify 机制
管道输入/输出流
Thread.join()
ThreadLocal的使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值