2010-10-05 4 views
8

Faccio uno strumento e fornisco un'API per il mondo esterno, ma non sono sicuro che sia sicuro per i thread. Perché gli utenti potrebbero volere usarlo in ambiente multi-thread. C'è qualche modo o strumento che posso usare per verificare se la mia API è thread-safe in Java?C'è qualche modo o strumento che posso usare per verificare se la mia API è thread-safe in Java?

+0

come si prova con jmeter e vedere cosa succede o qualsiasi altro strumento di test automatico, forse grinder – ant

+0

Si potrebbe semplicemente sincronizzare il tutto. Non si ridimensiona a più thread ma non si romperà anche a causa di thread non validi. Il tuo obiettivo è l'efficienza della mancanza di un fallimento catastrofico? –

+0

Domanda correlata che potrebbe aiutare http://stackoverflow.com/questions/424516/ogni-soddisfacenti-aggiornamenti-a-unità-testing-thread-safety-in-java – JRL

risposta

6

stress test, o strumenti di analisi statica come PMD e FindBugs può scoprire alcuni bug di concorrenza nel codice. Quindi questi possono mostrare se il tuo codice è non thread-safe. Tuttavia, non possono mai dimostrare se sono thread-safe.

Il metodo più efficace è una completa revisione del codice da parte degli sviluppatori esperti in concomitanza.

+1

L'uso di jMeter, pur non essendo a prova di proiettile, aiuta a identificare le stupidità dell'implementazione. Mi sono imbattuto in problemi di thread perché alcune classi in basso avevano un oggetto statico SimpleDateFormat che veniva utilizzato per generare parametri di data per le query SQL.Il driver sottostante, a un certo punto, ha iniziato a lamentarsi dei parametri di data non validi, il che ha aiutato a identificare questo particolare problema. – Fil

1

È sempre possibile sottoporlo a stress con strumenti come jmeter.

Ma il problema principale con fili è che sono in gran parte imprevedibile, quindi, anche con lo stress-test, ecc non si può essere sicuri al 100% che sarà completamente thread-safe.


Risorse:

+1

JMeter (e praticamente ogni altro strumento) può aiutarti a scoprire i problemi, ma non può mai verificare che il tuo codice sia corretto (specialmente con il codice multithread). –

+0

@Joachim Sauer, esattamente quello che sto dicendo. Non mostrerà problemi di sicurezza del thread ma ne può scoprire alcuni. –

+0

Test come quelli sono come test unitari ... non possono dirti dove il tuo codice è corretto, possono solo dirti dove è rotto. Ciò non li rende comunque meno utili :) – RHSeeger

17

No. Non esiste uno strumento del genere. Dimostrare che un programma complesso è thread-safe è molto difficile.

È necessario analizzare il programma con molta attenzione per garantire che sia thread-safe. Considera di acquistare "Concurrency Java in pratica" (ottima spiegazione della concorrenza in Java).

0

Non si può e non si sarà mai in grado di provare automaticamente che un programma è a prova di codice più che è possibile dimostrare che un programma è corretto (a meno che non si pensi di aver risolto il programma di interruzione, cosa che non si è verificato).

Quindi, no, non è possibile verificare che un'API sia protetta da thread.

Tuttavia, in alcuni casi è possibile dimostrare che è rotto, il che è fantastico!

Potresti anche essere interessato al rilevamento automatico dei deadlock, che in alcuni casi semplicemente "funziona". Sto spedendo un programma Java su centinaia di desktop con un tale rilevatore di deadlock installato ed è uno strumento meraviglioso. Per esempio:

http://www.javaspecialists.eu/archive/Issue130.html

Si può anche sottolineare testare l'applicazione in vari modi.

I programmi biro multipli multi-thread tendono a non funzionare molto bene quando è presente un carico elevato sul sistema.

Ecco una domanda ho chiesto informazioni su come creare facilmente creare un elevato carico della CPU su una Un * x sistema, ad esempio:

Bash: easy way to put a configurable load on a system?

+0

La dimostrazione di un singolo programma finito non arbitrario privo di determinati difetti non è un esempio di un problema equivalente all'arresto. Altrimenti non ci sarebbero cose come un compilatore di controllo dei caratteri. – soru

1

Si tratta di una variante (o cosiddetta "riduzione") del problema di interruzione. Pertanto è che risulta irrisolvibile. per tutti i casi non banali. (Sì, quella è una modifica)

Ciò significa che puoi trovare gli errori con qualsiasi mezzo (statistica, logica) ma non puoi mai provare completamente che non ce ne sono.

+0

Questo è ovviamente sbagliato: un singolo programma a thread è sempre protetto da un thread e un verificatore che controlla semplicemente il thread delle chiamate api rileverà il programma non a thread singolo il 100% delle volte. – soru

+1

@soru: hai ragione. Non è risolvibile * in generale *, mentre * casi specifici * (come programmi banali con una singola operazione) possono essere dimostrati corretti. Sfortunatamente quelli abbastanza banali da essere facilmente dimostrati di solito non sono abbastanza interessanti ;-) –

+0

Secondo la mia esperienza, è piuttosto improbabile che i programmi vengano divisi in due classi: – soru

1

Suppongo che quelle persone che dicono di provare un programma multithread arbitrario sia sicuro per i thread è impossibile sono, in un certo senso, corretto. Un programma multithread arbitrario, codificato senza seguire rigide linee guida, semplicemente ha bug di threading e non è possibile provare validamente qualcosa che non sia vero.

Il trucco non è scrivere un programma arbitrario, ma uno con logica di thread abbastanza semplice da poter essere corretto. Questo quindi può essere validato in modo inequivocabile da uno strumento.

Il miglior strumento di cui sono a conoscenza è CheckThread. Funziona sulla base di annotazioni o file di configurazione xml. Se contrassegni un metodo come '@ThreadSafe' e non lo è, otterrai un errore in fase di compilazione. Questo viene verificato osservando il codice byte per operazioni thread-safe, ad es. legge/scrive sequenze su campi di dati non sincronizzati.

Gestisce anche le API che richiedono che i metodi vengano chiamati su thread specifici, ad es. Swing.

In realtà non gestisce i deadlock, ma è possibile eliminarli staticamente senza richiedere annotazioni, utilizzando uno strumento come Jlint. Hai solo bisogno di seguire alcuni standard minimi come garantire che i lucchetti siano acquisiti secondo un DAG, non volenti o nolenti.