Java并发基础(三)-线程安全

来源:互联网 发布:日本 常任理事国知乎 编辑:程序博客网 时间:2024/05/16 14:29

1. 什么是线程安全

如果一个对象可以安全的被多个线程同时使用,那么它就是线程安全的


当多个线程访问一个对象的时候,如果不考虑这些线程在运行时环境下的调度和交替执行,也不需要额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的。

2. Java中的线程安全

根据线程安全的安全程度由强至弱来排序,可以分为5类:

  • 不可变
  • 绝对线程安全
  • 相对线程安全
  • 线程兼容
  • 线程对立

3. 线程安全的实现方法

  • 互斥同步,
    • synchronized
    • ReentrantLock 重入锁
  • 非阻塞同步,基于冲突检测的乐观并发策略,先进行操作,如果没有其他线程竞争共享数据,就操作成功了。否则,产生冲突,再采用补偿措施(最常见的就是不断重试),这种不需要将线程挂起,为非阻塞。这些涉及到处理器指令
    • 测试并设置(Test-and-Set)
    • 获取并增加(Fetch-and-Increment)
    • 交换(swap)
    • 比较并交换(Compare-and-Swap CAS)
    • 枷锁链接/条件存储(Load-LInked/Store-Conditional LL/SC)
  • 无同步方案
    • 可重入代码 这种代码叫纯代码,可以在代码执行的任何时刻中断他,转而执行另一段代码,但是,回来之后,并不会出现任何错误。
    • 线程本地存储 ThreadLocal

线程安全这块深究下去比较难。建议去看下深入理解JVM一书。

参考资料

  • 深入理解JVM
2 3
原创粉丝点击