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

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

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

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

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