java – synchronized和static synchronized有什么区别?

对于旅行预订Web应用程序,其中有100个并发用户登录,
机票预订和生成“电子机票号码”是通过“同步”还是“静态同步”方法实现的?

解决方法:

那么,您是否了解静态方法和实例方法之间的区别?

同步的唯一区别是,在VM开始运行该方法之前,它必须获取监视器.对于实例方法,获取的锁是与您调用方法的对象关联的锁.对于静态方法,获取的锁与类型本身相关联 – 因此没有其他线程可以同时调用任何其他同步的静态方法.

换句话说,这个:

class Test
{
    static synchronized void Foo() { ... }

    synchronized void Bar() { ... }
}

大致相当于:

class Test
{
    static void Foo()
    {
        synchronized(Test.class)
        {
            ...
        }
    }

    void Bar()
    {
        synchronized(this)
        {
            ...
        }
    }
}

通常我倾向于根本不使用synchronized方法 – 我更喜欢在私有锁引用上显式同步:

private final Object lock = new Object();

...

void Bar()
{
    synchronized(lock)
    {
        ...
    }
}

您尚未提供足够的信息来确定您的方法应该是静态方法还是实例方法,或者它是否应该同步.多线程是一个复杂的问题 – 我强烈建议你阅读它(通过书籍,教程等).

上一篇:Java – 在另一个线程中使用可变对象引用的首选设计?


下一篇:Linux中等效的WaitForSingleObject和WaitForMultipleObjects?