Utilizzare il lock in sola scrittura di oggetti con il .NET Framework

di Andrea Zani, in UserScript, ASP.NET, VB.NET,

Nello script precedente sull'argomento (#612) abbiamo visto come effettuare il lock delle risorse per evitare che accessi contemporanei possano "corrempere" il contenuto della stessa.
Uno degli svantaggi di tale tecnica è che essa preclude sia gli accessi in lettura che quelli in scrittura, senza distinzione.
Questo potrebbe portare ad un decadimento delle prestazioni inutile.
Ipotizziamo di avere ancora il classico contatore che viene utilizzato per contare, in questo caso, quante volte si è cliccato su un link, ed è allo stesso tempo utilizzato per visualizzare quante volte questo link è stato visitato.
Nel 99% dell'utilizzo di questa risorsa ci limiteremo solo a leggere il contenuto di tale file, e solo l'1% ad aggiornarlo, ed è proprio questo uno di quei casi in cui il lock completo della risorsa è antiproducente.
Come possiamo risolvere? Per fortuna è stata creata una classe di nome "ReaderWriterLock", che ci permette di fare in modo che una risorsa possa essere letta contemporanemaneto da qualsiasi utente, ma nel momento della modifica un solo utente possa accedervi.
Vediamo la struttura di una classe con due funzioni, la prima per la lettura della risorsa, e l'altra per la scrittura e aggiugiamo l'utilizzo di questa classe per il lock:

public class Test
  Private Shared rwl As New ReaderWriterLock()

  Public Shared Function Leggi()
    rw1.AcquireReaderLock()

    ' Codice per lettura della risorsa

    rw1.ReleaseReaderLock()
  End Function

  Public Shared Function Aggiorna()
    rw1.AcquireWriterLock()

    ' Codice per la modifica della risorsa

    rw1.ReleaseWriterLock()
  End Function
end class

Si deve fare attenzione all'uso di queste funzioni per il lock. Nel caso ci fosse qualche problema con l'accesso della risorsa e venisse generata un'eccezione, il lock non sarebbe rilasciato e questo bloccherebbe l'accesso per il resto della vita dell'applicazione a quel processo.

In tal caso è buona regola l'utilizzo del try...finally:

Public Shared Function Leggi()
  try
    rw1.AcquireReaderLock()

    ' Codice per lettura della risorsa

  finally
    rw1.ReleaseReaderLock()
  end try
end function

Approfondimenti

http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemThreadingReaderWriterLockClassReleaseWriterLockTopic.asp

#612 - Utilizzare il lock di oggetti con il .NET Framework
https://www.aspitalia.com/liste/usag/script.aspx?ID=612

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi