这可能是一个非常普遍的问题,但我还是会回答的,因为我需要诚实的建议。我有一个非常简单的库,主要是threadsafe,因为大多数类都是不可变的。但是,我有2-3个类不是,我不能修改它们。
此库广泛用于异步HTTP客户端。它是这样工作的。使用观察者实例化客户端。观察者处理所有完成、失败或加载事件。观察者还从另一个库中调用必要的函数。
我使用异步HTTP客户端,几乎就像它在具有非阻塞io的单个线程中运行一样。但是,在底层,客户端使用线程池。
我的问题是:如果我使观察者中的所有处理程序方法同步,是否可以解决所有其他线程安全问题?
例如,我们有以下设置。
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库是基于线程和阻塞的,但其余的代码不是...一切都是以事件为基础的。
发布于 2011-06-10 17:29:49
除了添加synchronized之外,检查这三(2)个方法是否未修改类字段。如果是,您可以使用ThreadLocal。
用法: uniqueNum是类字段,但它使用ThreadLocal声明。所以它是安全的。
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发布于 2011-06-10 15:49:57
只要另一个库没有/调用不安全的静态方法,它就应该使它成为线程安全的。这仅适用于有多个观察者对象并且它们可以并行调用的情况。如果不是这样,那么它应该是可以的。
https://stackoverflow.com/questions/6303077
复制相似问题