Domanda

Come annullare il rilascio di una garanzia di pubblicazione sicura in Java?

Per essere concreti:

Ho un'interfaccia Cache che ha un metodo getOrLoad (tasto K, caricatore ObjectLoader). Il fatto è che se una cache non riesce a trovare un oggetto per la chiave specificata, allora deve caricarlo dall'istanza ObjectLoader. Tuttavia, la cache deve garantire che l'atto di caricare un oggetto dal caricatore e metterlo nella cache costituisca una pubblicazione sicura.

Ora sto scrivendo un test junit generico per questa interfaccia Cache e mi chiedo come testerei che le implementazioni Cache aderiscano a questa garanzia di pubblicazione sicura.

Qualche idea? Il codice effettivo si trova nella parte del modulo più test del repository di codice nel caso in cui tu voglio dare un'occhiata ai file reali.

È stato utile?

Soluzione 2

Ho scoperto una JavaOne presentation di Bill Pugh, Brian Goetz e Cliff Fare clic sull'argomento test del codice simultaneo. Hanno suggerito questo approccio, la strega penso sia la migliore che abbia mai sentito:

Un certo numero di produttori crea oggetti con stato e thread non sicuri con un'implementazione hashCode dipendente dallo stato. Man mano che gli oggetti vengono inviati attraverso il presunto punto di sincronizzazione, vengono sommati gli hashCode (thread-localmente). Allo stesso modo, i consumatori dall'altra parte del gate riassumono gli hashCode.

Alla fine del test, riassumiamo tutti i risultati rispettivamente per produttori e consumatori. Se le due somme sono uguali, il test ha esito positivo.

Potremmo anche usare XOR come alternativa alla somma. In effetti, qualsiasi operazione commutativa farà. Tieni presente che il cablaggio di test stesso non deve introdurre alcuna sincronizzazione aggiuntiva.

Altri suggerimenti

Forse puoi usare ConTest almeno per darti un po 'più di fiducia che il tuo codice è corretto.

Dovrai implementare un paio di test che eseguono più thread contemporaneamente. ConTest aumenterà quindi la probabilità che un bug di concorrenza sia effettivamente rivelato dalla strumentazione del codice byte (aggiungendo istruzioni di sospensione e di rendimento condizionate controllate euristicamente).

In realtà ottenere un errore a causa di pubblicazioni non sicure è molto difficile (se qualcuno sa come, fammelo sapere). L'analisi statica è la soluzione migliore per una soluzione automatizzata. Vorrei attenermi alla revisione del codice e non preoccuparmene indebitamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top