Java中的通用线程安全代理

时间:2013-11-23 17:42:05

标签: java thread-safety metaprogramming aspectj proxy-classes

很抱歉,如果这是一个常见问题,请找不到答案。

我想知道是否存在可用于集合的线程安全代理的泛化,那些使非同步集合同步的代理。

使用AspectJ,应该可以写:

class ThreadSafeProxy
{
  public static <T> T getInstance ( T unsinchronizedObject )
}

将返回一个对象,其中unsinchronizedObject的所有公共方法都将被截获并包含在synchronize(unsinchronizedObject)中。如果没有AspectJ,应该可以写:

<T> T static synchronizeMethod ( Object unsynchObject, Class<T> returnType, String methodName, Object... params )

通过反思实现它。虽然这会更慢,也可能不那么实用。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

你当然可以这样做,但可能会遇到一些问题,例如:

  1. 效果。您的代码可能会不必要地过度同步。
  2. 死锁。如果对象A尝试在一个线程中调用(直接或间接)对象B中的方法,同时对象B尝试(直接或间接)调用方法对象A,你会遇到死锁 - 一种挂起。如果有这种可能性,您将不得不重新考虑您的方法。

答案 1 :(得分:-1)

我认为java.util.Collections synchronizedCollection方法就是你所需要的。

http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#synchronizedList%28java.util.List%29