0

我寫了一個數據庫查詢的包裝,需要從不同的線程訪問它。因此,我的應用程序創建該助手類的一個實例,並通過getter返回它。同步本地變量,比同步方法更好?

DbConnection dbc = app.getDatabaseConnection(); 
synchronized (dbc) { 
    dbc.doSomething(); 
} 

此代碼是否安全?如here所述,它應該工作,儘管在局部變量上同步。只要對象實例保證相同,這是否正確?

DbConnection的所有受影響的實例方法是否是同步更好的方法?

+0

如果可能,你應該讓'dbc'爲'private',更重要的是'final'。 – Gray

回答

2

這不是很好的設計。

而不是通過在必要時使其方法/塊同步,使您的DBConnection類具有固有線程安全性,而是強制此類的所有客戶端在每次需要時都明確同步。因此,不要將線程安全封裝在單一的,標識良好的課程中,而是將這種責任分配給班級的所有客戶,使整個事情變得非常脆弱,並且可能發現一個極難找到的潛在錯誤。

也就是說,從多個線程使用單個數據庫連接本身並不是一個好主意。

+0

它是一個鎖定數據庫連接,只能有一個連接。我知道同步在這裏有缺點,但是當應用程序傳輸少量數據時,這應該不成問題。 –

+0

因此,假設底層數據庫連接是線程安全的(這已經是瘋狂的猜測),讓我們假設線程A啓動一個事務,然後不相關的線程B也嘗試啓動一個事務。你打算如何做這項工作?爲什麼不使用連接池,如果真的需要,甚至可以減少到1個連接。這至少會確保兩個線程不會同時使用相同的連接。 –

+0

數據庫的流量確實很少。如果所有事務都由提供同步方法的適配器(DbConnection)執行,它不應該工作嗎?如果這是一個愚蠢的問題,我很抱歉,但過去我沒有太多數據庫和線程安全方面的工作。 (我同意,類名是誤導性的,在某些提交中會改變它。) –

1

如果您的所有DbConnection實例方法都需要同步,則使所有方法同步。不要看你寫的代碼量,只看正確性。如果您同步每種方法,那麼您現在就沒有機會回過頭幾年並調用getDatabaseConnection,然後忘記同步。