Java:同步实用程序

我问这纯粹是为了确定在问题中实施课程的有价值的…

您是否知道Java实用程序类采用未同步的实例,使用reflection来调查该实例,并在同步调用中返回“包装”的输入实例?

(即:为任何实例创建同步委托类的工厂)

我喜欢Jon Skeet的回答; 它看到了森林而不是树木。 但要回答这个问题:

假设实例属于某个接口,使用java.lang.reflect.Proxy很容易。

 public final class SynchronizedFactory { private SynchronizedFactory() {} public static  T makeSynchronized(Class ifCls, T object) { return ifCls.cast(Proxy.newProxyInstance( object.getClass().getClassLoader(), new Class[] {ifCls}, new Handler(object))); } private static class Handler implements InvocationHandler { private final T object; Handler(T object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { synchronized (object) { return method.invoke(object, args); } } } } 

顺便说一句,此代码未经过测试。 使用风险由您自己承担。

不,我不知道那是什么 – 我很少想用它。

同步单个操作很少是有用的function。 通常,您希望一次同步几个操作。 简单地同步单个操作的东西给出了线程安全的假象 (足以使一些程序员不小心)而不处理需要以任何特定情况以primefaces方式执行哪些操作的真实决策。

我想提请注意Chris Jester-Young的解决方案有多酷。 我已经将它重构为一个简单的静态函数,我已经成功使用了下面包含的函数。 谢谢克里斯!

 /** * Utility that can take any object that implements a given interface and returns * a proxy that implements the same interface and synchronizes all calls that are * delegated to the given object. From Chris Jester-Young, http://about.me/cky * @param interfaceClass The interface to synchronize. Use MyInterface.class. * @param object The object to synchronize that implements the given interface class. * @return A synchronized proxy object that delegates to the given object. */ public static  T makeSynchronized(Class interfaceClass, final T object) { return interfaceClass.cast( Proxy.newProxyInstance( object.getClass().getClassLoader(), new Class[]{interfaceClass}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { synchronized (object) { return method.invoke(object, args); } } } ) ); } 

reflection的开销也会降低您通过线程化代码获得的加速…