1

我正在尝试同步访问公共资源(数据库)的类的实例。这可以通过使用 notify 和 wait() 来完成,但我需要知道,如果不同的 java 程序正在使用这个类来创建实例,那么如何同步它们。谢谢

4

2 回答 2

1

如果多个进程共享资源,同步将无济于事。同步等待/通知模型旨在用于单个进程中的多个线程。

您需要编写一个逻辑来显式锁定资源。在您的场景中,您需要在处理数据库表之前锁定它,以便其他进程无法同时访问它。

如果您使用的是 Oracle 数据库,那么您可以对数据库表使用 lock 语句:

您使用 LOCK TABLE 语句以指定的锁定模式锁定整个数据库表,以便您可以共享或拒绝对它们的访问。行共享锁允许对表的并发访问;它们防止其他用户锁定整个表以供独占使用。当您的事务发出提交或回滚时,会释放表锁。

于 2013-09-29T16:02:23.103 回答
1

正如 Sotirios Delimanolis 评论的那样 - “你不能。同步只能在一个 JVM 的范围内发生。”

因此,您应该使用一些外部资源来执行此同步。文件可能是一个很好的例子:

try {
    // Get a file channel for the file
    File file = new File("filename");
    FileChannel channel = new RandomAccessFile(file, "rw").getChannel();

    // Use the file channel to create a lock on the file.
    // This method blocks until it can retrieve the lock.
    FileLock lock = channel.lock();

    // ** Your logic here **
} finally {
    // Release and close 
    lock.release();
    channel.close();
}
于 2013-09-29T16:05:17.840 回答