首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java多线程和异步Http请求处理

Java多线程和异步Http请求处理
EN

Stack Overflow用户
提问于 2011-06-10 15:06:18
回答 2查看 1.6K关注 0票数 1

这可能是一个非常普遍的问题,但我还是会回答的,因为我需要诚实的建议。我有一个非常简单的库,主要是threadsafe,因为大多数类都是不可变的。但是,我有2-3个类不是,我不能修改它们。

此库广泛用于异步HTTP客户端。它是这样工作的。使用观察者实例化客户端。观察者处理所有完成、失败或加载事件。观察者还从另一个库中调用必要的函数。

我使用异步HTTP客户端,几乎就像它在具有非阻塞io的单个线程中运行一样。但是,在底层,客户端使用线程池。

我的问题是:如果我使观察者中的所有处理程序方法同步,是否可以解决所有其他线程安全问题?

例如,我们有以下设置。

代码语言:javascript
复制
Client -> calls methods from the
   Observer
      synchronized onLoaded -> calls thread unsafe code
      synchronized onError -> calls thread unsafe code
      synchronized onCompleted -> calls thread unsafe code

如果这没有意义,有没有可能以某种方式在主线程上执行这些方法中的所有代码,从而实现我正在尝试遵循的非阻塞io设计?

澄清:我知道异步HTTP库是基于线程和阻塞的,但其余的代码不是...一切都是以事件为基础的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-10 17:29:49

除了添加synchronized之外,检查这三(2)个方法是否未修改类字段。如果是,您可以使用ThreadLocal。

用法: uniqueNum是类字段,但它使用ThreadLocal声明。所以它是安全的。

代码语言:javascript
复制
 import java.util.concurrent.atomic.AtomicInteger;

 public class UniqueThreadIdGenerator {

     private static final AtomicInteger uniqueId = new AtomicInteger(0);

     private static final ThreadLocal < Integer > uniqueNum = 
         new ThreadLocal < Integer > () {
             @Override protected Integer initialValue() {
                 return uniqueId.getAndIncrement();
         }
     };

     public static int getCurrentThreadId() {
         return uniqueId.get();
     }
 } // UniqueThreadIdGenerator
票数 0
EN

Stack Overflow用户

发布于 2011-06-10 15:49:57

只要另一个库没有/调用不安全的静态方法,它就应该使它成为线程安全的。这仅适用于有多个观察者对象并且它们可以并行调用的情况。如果不是这样,那么它应该是可以的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6303077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档