如何同步不同的java程序以访问公共资源

时间:2013-09-29 16:00:02

标签: java multithreading

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

3 个答案:

答案 0 :(得分:1)

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

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

如果您使用的是Oracle数据库,则可以将lock语句用于数据库表:

  

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

答案 1 :(得分: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();
}

答案 2 :(得分:0)

您是否尝试已同步关键字来同步特定方法或语句,以便所有实例一次一个地输入此同步语句中。

EG。

synchronized(this) 
{  
     //Do code here
}