vector 基本每个方法都保证了原子性,但是组合起来也不一定。
1
Mithrandir 2019-05-28 11:04:27 +08:00
来把大锁就好了
|
2
Mithrandir 2019-05-28 11:04:55 +08:00
如果是无锁数据结构,那比较复杂
|
3
FelixLiu OP @Mithrandir 来把大锁的话,还不如就设计成单线程模式,效率还是要提高一点的。。。
|
4
mooncakejs 2019-05-28 11:22:04 +08:00
『大锁』
读写锁 分区锁 COW+Immutable |
5
FelixLiu OP @mooncakejs 我意思是有什么指导性原则吗?比如共享成员变量加锁之类的,实现可能很多种,事件、临界区、信号量。。。
|
6
wysnylc 2019-05-28 11:58:41 +08:00 1
首先 vector 只保证可见性不保证原子性,其次最安全的线程安全就是单线程参考实例 redis
解决并发的最终方案只有队列 |
7
tt67wq 2019-05-28 12:06:49 +08:00
原子性的实现参考数据库事务的实现方法
|
8
skypyb 2019-05-28 12:09:51 +08:00 via Android
线程最安全的就是不可变对象啦,你所有的属性包括类都是 final,就不用担心这问题了
|
12
CoderSun 2019-05-28 14:32:03 +08:00
java 里临界区,锁,volatile,信号量,根据业务选择合适的。
|
13
HuasLeung 2019-05-28 14:36:29 +08:00
自从用上了 go 语言的 goroutine,再也不用搞 java 线程中复杂的锁
|
14
jimrok 2019-05-28 16:14:50 +08:00
干活的线程不要共享数据,干完了把数据交出去。
|
15
sagaxu 2019-05-28 16:27:30 +08:00 via Android
熟读 Java 并发编程实践这本书
|
16
luozic 2019-05-28 16:30:49 +08:00 via iPhone
去抄 jdk Dou 大佬的代码。
|
17
momocraft 2019-05-28 16:35:43 +08:00
不能证明安全就是不安全
自己写得越少 / 向外暴露 (包括 API,时机,可访问到的线程) 越少越容易做到安全 |
21
jimrok 2019-05-28 17:01:37 +08:00 1
@FelixLiu 要想安全就不要共享数据,并发的线程之间如果用到某些数据,保持只读访问或者把需要的数据打包起来,发给执行任务的线程,处理过程中,修改完数据后,再发送给另外的处理模块。
|
22
23571113 2019-05-28 17:11:39 +08:00 1
组合起来想达到原子性就等于套用数据库的事务原子性的那一套方法,推荐你看一下 2PL 方法。有些无锁(不需要加锁就可以线程安全)的数据结构可能也能满足你的要求,比如 BwTree 这种你可以了解一下。
|
24
mooncakejs 2019-05-28 18:12:51 +08:00 1
@FelixLiu 我理解:指导下原则就是资源特点和对性能的要求指标是什么。
- 性能要求不高,来个大锁(对象锁)。 - 读多写少,就来读写锁; - 读写均衡,可以来分区 /分段锁。 - 资源为简单类型,atomic。 - 对更改不敏感,COW & TheadLocal - 实时性邀请不高,外部队列。 |
25
oneisall8955 2019-05-29 01:26:43 +08:00 via Android
@skypyb 还有这种说法?。。。
|
26
FelixLiu OP @mooncakejs 这个总结的挺好,简单明了
|