Java:同步实用程序

And*_*NER 3 java synchronization utilities

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

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

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

Jon*_*eet 8

不,我不知道那是什么 - 我很少想用它.

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


Chr*_*ung 7

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

假设实例属于某个接口,则很容易使用它java.lang.reflect.Proxy来执行此操作.

public final class SynchronizedFactory {
    private SynchronizedFactory() {}

    public static <T> T makeSynchronized(Class<T> ifCls, T object) {
        return ifCls.cast(Proxy.newProxyInstance(
                object.getClass().getClassLoader(),
                new Class<?>[] {ifCls},
                new Handler<T>(object)));
    }

    private static class Handler<T> 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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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