2013-09-29 41 views
1

我想同步訪問公共資源(數據庫)的類的實例。這可以通過使用notify和wait()來完成,但是我需要知道如果不同的java程序正在使用這個類創建實例,而不是如何同步它們。 謝謝如何同步不同的Java程序來訪問公共資源

+1

你不能。同步只能在一個JVM的範圍內發生。 –

+0

也許你應該使用數據庫的事務機制,這取決於你的需求可能就足夠了。 –

+0

這就是我的想法。謝謝。 –

回答

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(); 
} 
1

在多個進程正在共享資源的情況下,同步將無濟於事。同步等待/通知模型旨在用於單個進程中的多個線程。

您需要編寫一個邏輯來顯式鎖定資源。在你的場景中,你需要在處理之前鎖定數據庫表,以便其他進程不能同時訪問它。

如果您正在使用Oracle數據庫,那麼你可以使用lock語句到數據庫表:

您可以使用LOCK TABLE語句來鎖定整個數據庫表中的一個 指定的鎖定模式,這樣就可以共享或拒絕訪問他們。行 共享鎖允許併發訪問表;他們阻止其他 用戶鎖定整個表格以供專用。當您的事務發出提交或回滾時,表鎖定爲 。

+0

嗯,我試圖鎖定表,如果一個請求來它但其他所有的Java程序引發異常。 –

+0

@RishabhKumar正是這個想法,當一個進程正在使用它或鎖定它時,其他進程應該會得到一個異常。 –

0

你嘗試同步關鍵字來同步特定的方法或語句,這樣所有的情況下將這種同步語句一次一個進入裏面。

例如,

synchronized(this) 
{ 
    //Do code here 
} 
相關問題