簡體   English   中英

一個線程在不被讀取的同時寫入數據,許多線程在不被寫入的同時讀取數據

[英]One thread writes data while not being read, many threads read while data is not being written

我不僅對鎖和同步塊有基本的了解。 但是,據我所知,它們只是確保單個線程一次可以訪問某些數據。

我需要的有點不同。 可以說我有一個字符串。 我只有一個線程對其進行了更改(為其分配了一些值),並假定此操作花費大量時間-3秒。

許多其他線程需要讀取此String的值,並假設值在整個塊執行之前一直保持不變,然后執行一些操作(執行代碼塊)。 假設該塊執行需要5秒鍾。

因此,當存在使用/讀取字符串的線程時,“寫入器”線程不得更新該字符串,並且“讀取器”線程必須等待(由“寫入器”執行的)更新完成,然后才能開始使用它。

如果只有1個“ writer”和1個“ reader”,我可以用鎖解決這個問題,但是現在只有1個“ writer”和N個“ readers”,我該怎么辦? 請注意,許多“讀取器”可能會同時訪問數據。

順便說一下,由於它有數百行,包括互聯網訪問,數據庫訪問...,因此很難提供代碼。

我知道我可以通過更改實現來避免此問題,但是我有理由偏愛此實現-而且我也不懶於更改它。

您正在尋找的是ReadWriteLock 多個線程可以同時讀取的位置。 寫入被阻止,直到讀取線程結束。 並阻止讀取 ,直到寫入線程完成為止。

如果操作花費這么長時間,則說明您做錯了什么。 正確的方法是在不影響舊數據的情況下計算新數據(無論花費多長時間),然后一次性將新數據替換為新數據。 並且只有在每個人都使用完舊數據后才銷毀舊數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM