java - 同步和静态同步有什么区别?

标签 java multithreading synchronization

对于有 100 个并发用户登录的旅游预订 Web 应用程序, 订票和生成“电子客票号”应该用“同步”还是“静态同步”的方式实现?

最佳答案

那么,您知道静态方法和实例方法之间的一般区别吗?

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

换句话说,这:

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

    synchronized void Bar() { ... }
}

大致等同于:

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

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

通常我根本不使用同步方法——我更喜欢在私有(private)锁引用上显式同步:

private final Object lock = new Object();

...

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

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

关于java - 同步和静态同步有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1536064/

相关文章:

java - jlist 不会显示整行或太多

Java:在断点调试期间在隐式队列中检测到 "gridlock"

java - 为什么我会收到此错误 "The constructor is undefined"?

java - Spring 和编程式事务管理的连接池问题

c++ - 如果这不是 boost::lockfree::detail::freelist 中的错误,我在这里缺少什么?

javascript - 使用 Ajax 时检查客户端和服务器的同步状态

c++ - 在我的情况下是否需要互斥锁

java - 请解释 Java 内存模型中阐明的初始化安全性

java - JavaFX FileChooser "remember"可以是它打开的最后一个目录吗?

java - 如何从服务器连接两个客户端