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

2019-05-28 10:49:21 +08:00
 FelixLiu

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

3405 次点击
所在节点    程序员
26 条回复
Mithrandir
2019-05-28 11:04:27 +08:00
来把大锁就好了
Mithrandir
2019-05-28 11:04:55 +08:00
如果是无锁数据结构,那比较复杂
FelixLiu
2019-05-28 11:18:08 +08:00
@Mithrandir 来把大锁的话,还不如就设计成单线程模式,效率还是要提高一点的。。。
mooncakejs
2019-05-28 11:22:04 +08:00
『大锁』
读写锁
分区锁
COW+Immutable
FelixLiu
2019-05-28 11:26:17 +08:00
@mooncakejs 我意思是有什么指导性原则吗?比如共享成员变量加锁之类的,实现可能很多种,事件、临界区、信号量。。。
wysnylc
2019-05-28 11:58:41 +08:00
首先 vector 只保证可见性不保证原子性,其次最安全的线程安全就是单线程参考实例 redis
解决并发的最终方案只有队列
tt67wq
2019-05-28 12:06:49 +08:00
原子性的实现参考数据库事务的实现方法
skypyb
2019-05-28 12:09:51 +08:00
线程最安全的就是不可变对象啦,你所有的属性包括类都是 final,就不用担心这问题了
FelixLiu
2019-05-28 13:39:38 +08:00
@wysnylc 阔以,道路千万条,安全第一条
FelixLiu
2019-05-28 13:40:21 +08:00
@skypyb 不可变对象。。。做不到哇
FelixLiu
2019-05-28 13:40:45 +08:00
@tt67wq 我研究下
CoderSun
2019-05-28 14:32:03 +08:00
java 里临界区,锁,volatile,信号量,根据业务选择合适的。
HuasLeung
2019-05-28 14:36:29 +08:00
自从用上了 go 语言的 goroutine,再也不用搞 java 线程中复杂的锁
jimrok
2019-05-28 16:14:50 +08:00
干活的线程不要共享数据,干完了把数据交出去。
sagaxu
2019-05-28 16:27:30 +08:00
熟读 Java 并发编程实践这本书
luozic
2019-05-28 16:30:49 +08:00
去抄 jdk Dou 大佬的代码。
momocraft
2019-05-28 16:35:43 +08:00
不能证明安全就是不安全
自己写得越少 / 向外暴露 (包括 API,时机,可访问到的线程) 越少越容易做到安全
FelixLiu
2019-05-28 16:42:40 +08:00
@HuasLeung 哈哈哈,最近我也在学 go
FelixLiu
2019-05-28 16:44:09 +08:00
@jimrok 主要可能某个活比较重,需要派多个线程去干才能保证延迟。
FelixLiu
2019-05-28 16:45:32 +08:00
@momocraft 精辟啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/568284

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX