px96004
2013-09-29 12:16
2013-09-27 22:17 "@w438418754

"的内容

这个有些疑问,比如A发起转账,在转账中我需要判断A账户余额是否满足转账条件,满足后发送转账消息,那么在还没处理消息时,这是的余额是还没有扣除的,那么A又发起了一个转账,假设余额有1000 那么第一次转账为500 第二次为600 ,如果第二次 ...

消息是有序列的啊.第一次没转完.第二次就不会启动.等第一次都处理利索了.再处理第二次吧.

guitar427
2014-04-10 14:06
2013-09-12 07:59 "@banq

"的内容

A作为一个对象,注意不是数据表,对象是有行为的,检查自己余额是否可转账,如果可以,冻结这部分金额,比如转账100元,冻结100元,从余额中扣除。因为外部命令是通过消息顺序进来的,所以下一个消息如果也是扣除,再次检查余额是否足够...... ...

这个有些疑问,比如A发起转账,在转账中我需要判断A账户余额是否满足转账条件,满足后发送转账消息,那么在还没处理消息时,这是的余额是还没有扣除的,那么A又发起了一个转账,假设余额有1000 那么第一次转账为500 第二次为600 ,如果第二次转账的时候还没处理第一次的消息,那么第二次转账是会被发送消息的。

我也有同样的疑惑

sinaID87521
2014-06-20 17:13
2013-09-12 07:59 "@banq"的内容
例如下述代码,因为对象的行为要被线程调用,我们要使用同步锁synchronized :

public class A {

private volatile int lower, upper; //两个状态值

...

求解楼主,看不太懂

1. asynchronization是啥关键字

2. 只有 setAupper setAlower为什么能调用 a.setUpper

3. setAupper为啥调用a.setLower ?

4. a是哪里来的.

最后,我觉得这个永远不可能出现(4,3) 的情况.

可能第3点我没理解,有特别的含义.

[该贴被sinaID87521于2014-06-20 17:21修改过]

[该贴被sinaID87521于2014-06-20 18:01修改过]

lovejdon
2014-06-22 15:22
今天又重温了下这个帖子。结合Disruptor的机制和源码,个人理解如下:

虽然外部线程可以保证以MESSAGE的方式通知模型执行自身的行为修改模型状态,但正如道友提问的,多线程同时访问同一模型的时候,如何保证,比如帖子回复中提到的多次转账的问题。

在Disruptor中ringbuffer中的内容是可以多个消费者同时获取的,但是基于不同的类型是对应不同的处理逻辑,实际从全局看,仍然是单线程来处理用户的请求(顺序转账),故能保证其一致性。所以说没有类似DISRUTOR这样的底层机制。就没有了ACTOR模型的实现。

不知理解的是否正确,请BANQ大哥和道友指正!多谢

[该贴被lovejdon于2014-06-22 15:24修改过]

banq
2014-06-22 18:30
2014-06-22 15:22 "@lovejdon"的内容
请BANQ大哥和道友指正 ...

Actor模型不只是Disruptor,还有Akka框架,见这个Akka案例使用“协调事务Coordinated transactions”实现转账的案例,也许会开拓思路。

tecentID6D45F
2015-08-28 13:25
我也对actor比较疑问,就上面转账问题。1000元的情况,第一次转500,第2次转600的问题。你交到队列里面去判断。那我们整个系统的逻辑部分。怎么写?岂不是都在队列处理的时候做判断了!如果在队列外处理。我的判断就有可能出错。只能保证数据不会出错!但我的判断可能引发其他的逻辑触发!这点怎么处理!还是我理解错了!

sinaID74596
2015-12-02 19:47
实在是不敢恭维楼主。

你贴的那个A类,错误一大堆,而且你发现没,这个类是个死循环。

tecentID9F04C
2015-12-03 18:18
我也认为开头那个例子是会死循环的!无限嵌套嘛。

猜你喜欢
2Go 上一页 1 2