Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 共享状态:由一个线程访问,而不是由多个线程访问+;高级缓存_Java_Multithreading_Concurrency_Vert.x_Reactor - Fatal编程技术网

Java 共享状态:由一个线程访问,而不是由多个线程访问+;高级缓存

Java 共享状态:由一个线程访问,而不是由多个线程访问+;高级缓存,java,multithreading,concurrency,vert.x,reactor,Java,Multithreading,Concurrency,Vert.x,Reactor,这是对这些问题的延伸:(我从2008年1月8日和20日发布的帖子) 我有State、4个eventloop线程/上下文和一个context-to-State绑定器 T state; Context contextToStateBinder; 在vertx中,webrequests以循环方式路由到不同的eventloops,因此 request 1 -> eventloop A request 2 -> eventloop B request 3 -> eventloop C

这是对这些问题的延伸:(我从2008年1月8日和20日发布的帖子)

我有State、4个eventloop线程/上下文和一个context-to-State绑定器

T state;
Context contextToStateBinder;
在vertx中,webrequests以循环方式路由到不同的eventloops,因此

request 1 -> eventloop A
request 2 -> eventloop B
request 3 -> eventloop C
request 4 -> eventloop D
request 5 -> eventloop A
...
如果我想从该请求访问共享状态,我可以采用以下解决方案:

解决方案一

只有同一线程/上下文才允许访问状态 所以也许我决定使用contextToStateBinder->eventloop B上下文

所以每次我想访问state时,我都必须将eventloop更改为:contextToStateBinder.runOnContext(…)

解决方案二

我必须同步状态:已同步或CAS操作(复制状态、更改状态、用CAS写回、如果成功->完成、如果失败->重试)

我的cas/synchronized或带有runOnContext(内部mpsc队列)的eventlloop开关都具有易失性读写

那么我的问题是:什么更便宜?

我的状态可能有一个游戏单元/聊天室:我想最好的方法是更改上下文,而不是通过不同的线程访问此状态,对吗?

我的状态可能是用户的会话状态:这里Julien(vertx项目负责人)提到将用户绑定到特定上下文不是一个好主意(但为什么?他到目前为止还不这么认为) 如果我静态地将不同的用户安排到不同的上下文中,这可能是个问题。。。。。。因此,一个eventloop可能比另一个eventloop有更多的请求。但是如果我重新安排(将用户重新绑定到其他竞赛,所有上下文都有相同的流量),那么我看不出有任何问题吗

但如果我这样做,我还可能遇到哪些问题?

我猜为什么它如此强大,将用户绑定到某个eventloop线程是以下示例:

高级缓存:

user1 -> request 1 -> eventloop A -> correct to B -> start a long-database-operation -> save the future of that operation in his state -> close the connection
user1 -> request 2 -> eventloop A -> correct to B -> want-to-recieve-the-database-result -> get the future from that state -> setTheReturn-Handler -> (maybe the result isnt yet completed) -> result-handler is executed after completion -> return the result to the user1
所以我不知道如何解决这个问题,如果我不在同一个上下文/eventloop上:我想如果请求1和请求2从不同的线程访问状态和未来,那么它就不会工作。

我必须在那里使用相同的Eventloop吗?或者是否存在从不同事件循环访问未来的好的其他解决方案?

你也可以在vertx论坛找到这个问题:


lg knotenpunkt

如果不同的工蜂线程需要看到相同的值,则需要同步对缓存的访问。但是,由于它们是响应web请求的,我认为没有必要变得复杂:获取某种信号量,点击缓存,释放信号量。也许我会编辑这个问题,并提供一些关于vertx本身的更多信息:vertx的诀窍是,你没有那么多线程,只有几个eventloop线程,在每个上下文中,你不需要同步,因为没有其他线程可以“崩溃”,但你是对的,如果我使用更多线程来读取相同的全局状态,那么我需要一些同步技术。但是它很贵,我不想要。Eventloop线程不允许阻塞,否则vertx就不会像vertx所认为的那样快了^^