首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coding
V2EX  ›  程序员

怎么设计一个线程安全的类?有什么原则吗?比如 vector?

  •  1
     
  •   FelixLiu · 200 天前 · 1954 次点击
    这是一个创建于 200 天前的主题,其中的信息可能已经有所发展或是发生改变。

    vector 基本每个方法都保证了原子性,但是组合起来也不一定。

    26 回复  |  直到 2019-05-29 09:13:25 +08:00
        1
    Mithrandir   200 天前
    来把大锁就好了
        2
    Mithrandir   200 天前
    如果是无锁数据结构,那比较复杂
        3
    FelixLiu   200 天前
    @Mithrandir 来把大锁的话,还不如就设计成单线程模式,效率还是要提高一点的。。。
        4
    mooncakejs   200 天前
    『大锁』
    读写锁
    分区锁
    COW+Immutable
        5
    FelixLiu   200 天前
    @mooncakejs 我意思是有什么指导性原则吗?比如共享成员变量加锁之类的,实现可能很多种,事件、临界区、信号量。。。
        6
    wysnylc   200 天前   ♥ 1
    首先 vector 只保证可见性不保证原子性,其次最安全的线程安全就是单线程参考实例 redis
    解决并发的最终方案只有队列
        7
    tt67wq   200 天前
    原子性的实现参考数据库事务的实现方法
        8
    skypyb   200 天前 via Android
    线程最安全的就是不可变对象啦,你所有的属性包括类都是 final,就不用担心这问题了
        9
    FelixLiu   200 天前
    @wysnylc 阔以,道路千万条,安全第一条
        10
    FelixLiu   200 天前
    @skypyb 不可变对象。。。做不到哇
        11
    FelixLiu   200 天前
    @tt67wq 我研究下
        12
    CoderSun   200 天前
    java 里临界区,锁,volatile,信号量,根据业务选择合适的。
        13
    HuasLeung   200 天前
    自从用上了 go 语言的 goroutine,再也不用搞 java 线程中复杂的锁
        14
    jimrok   200 天前
    干活的线程不要共享数据,干完了把数据交出去。
        15
    sagaxu   200 天前 via Android
    熟读 Java 并发编程实践这本书
        16
    luozic   200 天前 via iPhone
    去抄 jdk Dou 大佬的代码。
        17
    momocraft   200 天前
    不能证明安全就是不安全
    自己写得越少 / 向外暴露 (包括 API,时机,可访问到的线程) 越少越容易做到安全
        18
    FelixLiu   200 天前
    @HuasLeung 哈哈哈,最近我也在学 go
        19
    FelixLiu   200 天前
    @jimrok 主要可能某个活比较重,需要派多个线程去干才能保证延迟。
        20
    FelixLiu   200 天前
    @momocraft 精辟啊
        21
    jimrok   200 天前   ♥ 1
    @FelixLiu 要想安全就不要共享数据,并发的线程之间如果用到某些数据,保持只读访问或者把需要的数据打包起来,发给执行任务的线程,处理过程中,修改完数据后,再发送给另外的处理模块。
        22
    23571113   200 天前   ♥ 1
    组合起来想达到原子性就等于套用数据库的事务原子性的那一套方法,推荐你看一下 2PL 方法。有些无锁(不需要加锁就可以线程安全)的数据结构可能也能满足你的要求,比如 BwTree 这种你可以了解一下。
        23
    FelixLiu   200 天前
    @23571113 欧克,了解一波。
        24
    mooncakejs   200 天前   ♥ 1
    @FelixLiu 我理解:指导下原则就是资源特点和对性能的要求指标是什么。
    - 性能要求不高,来个大锁(对象锁)。
    - 读多写少,就来读写锁;
    - 读写均衡,可以来分区 /分段锁。
    - 资源为简单类型,atomic。
    - 对更改不敏感,COW & TheadLocal
    - 实时性邀请不高,外部队列。
        25
    oneisall8955   200 天前 via Android
    @skypyb 还有这种说法?。。。
        26
    FelixLiu   199 天前
    @mooncakejs 这个总结的挺好,简单明了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   895 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 28ms · UTC 22:44 · PVG 06:44 · LAX 14:44 · JFK 17:44
    ♥ Do have faith in what you're doing.