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