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

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

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

synchronized的唯一区别是,在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) { ... } } 

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

Jon的答案涵盖了问题标题中暗示的差异。

但是,我会说不应该用于生成票号。 假设这些存储在数据库中的某个地方 – 数据库应该负责在插入新记录时生成数字(可能是通过自动增量主键或类似的东西)。

如果不这样做,如果你必须在Java代码中生成数字,我怀疑100个并发用户的同步开销可能非常明显。 如果您在Java 1.5或更高版本上运行,我将使用java.util.concurrent.AtomicInteger来获取票号,您可以简单地将其称为

 private static final AtomicInteger ticketSequence; static { final int greatestTicket = getHighestExistingTicketNumber(); // May not be needed if you can start from zero each time ticketSequence = new AtomicInteger(greatestTicket + 1); } public /*static*/ int getNextTicketNumber() { return ticketSequence.incrementAndGet(); } 

这为您提供了所需的并发全局唯一性,比每次需要整数时同步更有效。