博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程安全性的文档化(70)
阅读量:6453 次
发布时间:2019-06-23

本文共 722 字,大约阅读时间需要 2 分钟。

hot3.png

当一个类的实例或者静态方法被并发使用的时候,这个类的行为如何,

  • 是该类与客户端程序的行为约束
  • 如果文档中没有相关描述,那么可能导致未同步或过度同步的情况

并不是说文档中出现Synchronized 就说明是线程安全

  • synchronized 可能仅仅是实现细节

线程安全是分多种级别的:

  • 一个类可以被多个线程安全的使用,必须在文档中清楚的说明其支持的安全级别
  • 常见情形安全级别划分:
    • 不可变:
      • 实例是不可变的,不需要外部的同步
      • 如:String、Long、BigInteger等
    • 无条件的线程安全:
      • 可变实例,内部拥有足够的同步,无需任何外部同步
      • 如:Random、ConcurrentHashMap
        • ConcurrentHashMap是线程安全的,
          • 将Map 分成16个segment,
          • 按照hash值对应key到某个segment
          • 每个操作都是线程安全的
    • 有条件的线程安全:
    • 非线程安全:
      • 必须外部同步包围每个方法调用,才能正常使用
      • 比如:ArrayList、HashMap
    • 线程对立的
      • 这个类不能安全的被多个线程并发调用,即使所有方法都被外部同步
      • 出现这种问题的根源在于,没有同步修改静态变量

公有同步锁、

  • 允许客户端程序以原子形式执行一个方法调用序列
  • 比如ConcurrentHashMap

私有同步锁

  • 客户端无法访问锁
  • 私有锁对象只能用到无条件线程安全类上

b845eed148e3209b4803c33a6911b1b3ee7.jpg

总结::

  • synchronized 注释与该类是否线程安全毫无关系
  • 无条件线程安全类,请使用私有锁来代替同步的方法
  • 有条件的线程安全类,必须在文档标明哪个方法调用时需要外部同步

转载于:https://my.oschina.net/u/3847203/blog/2989373

你可能感兴趣的文章
最简单的RPC框架实现
查看>>
Servlet 技术全总结 (已完成,不定期增加内容)
查看>>
[JSOI2008]星球大战starwar BZOJ1015
查看>>
CountDownLatch与thread-join()的区别
查看>>
linux下MySQL安装登录及操作
查看>>
centos 7 部署LDAP服务
查看>>
揭秘马云帝国内幕:马云的野心有多大
查看>>
topcoder srm 680 div1
查看>>
算法专题(1)-信息学基本解题流程!
查看>>
模拟文件系统
查看>>
使用SSH连接Windows10 Ubuntu (WSL),Pycharm
查看>>
poj2155
查看>>
CSS动画之转换模块
查看>>
swift - UITextField 的用法
查看>>
检索和关闭游标+检索游标+关闭游标
查看>>
[开源]KJFramework.Message 智能二进制消息框架 -- 性能提升
查看>>
iOS项目分层
查看>>
CocosCreator 小知识
查看>>
如何称为演讲高手
查看>>
PHP坑之积累
查看>>