2013-03-31 2 views
5

Sto leggendo i codici java per garantire che sia thread-safe.Come si analizza il codice sorgente Java e si assicura che sia thread safe

Come comprendo, qualsiasi variabile locale all'interno del metodo è thread-safe poiché appartiene all'indirizzo di memoria dello stack. Qualsiasi variabile di classe/istanza non è thread-safe poiché appartiene alla memoria heap è condivisa da altri thread.

Con la regola empirica, posso mettere una parola chiave sincronizzata su ogni metodo che tocca le variabili di classe.

C'è qualche plugin di eclissi o regole che posso analizzare/prevenire problemi di multi-threading?

+1

Sì. FindBugs può eseguire tale analisi. Vedi: http://stackoverflow.com/questions/2423266/thread-safety-framework – noahlz

+0

Bene, un'istanza di oggetto creata da un thread e referenziata solo da quel thread, (ad esempio, il suo riferimento è una var locale), non è intrinsecamente condiviso con altri thread. –

+0

quali sono le altre "regole/punti" generali di cui dovrei prendere nota? – youcanlearnanything

risposta

5

Il mondo di threading è una delle cose più permalose per un buon programmatore. Ogni soluzione ai problemi di thread richiede una grande conoscenza del contesto. Qualsiasi plugin non sarebbe abbastanza "intelligente" per scegliere la soluzione più pertinente ogni volta.

Infatti, synchronized rappresenta circa il 5% di tutte le possibili soluzioni. Pensa a raccolte simultanee, ConcurrentHashMap per esempio che è molto ben pensato e non usa un grande blocco di base su di esso => ​​più studiato più complesso di quello.

Pensare a volatile, per garantire la protezione della barriera evitando qualsiasi tipo di nebulizzazione attraverso eventuali blocchi; atomicity non è il suo ruolo, ma in alcuni casi, sarebbe fantastico evitarlo per migliorare le prestazioni.

Pertanto, dimenticare tutti i plugin (anche se alcuni possono esistere) per thread-sicurezza, ma ritengono attendibile il cervello;)

Nota: Mettere synchronized parola chiave su ogni corso di scrittura, sarebbe ........ .ugly senza parlare delle scarse prestazioni ...

0

Non penso che Eclipse fornirà alcun plugin di questo tipo. Insieme alle variabili locali provate a usare oggetti Immutable, ThreadLocals e la maggior parte dei problemi di multithreading saranno presi in considerazione.

0

Non ho visto strumenti di compilazione del tempo in grado di rilevare deadlock. Sarebbe difficile da modellare. Tutto quello che so è che some people have tried.

È sempre possibile rilevarli in fase di esecuzione. JMX Beans può essere interrogato per mostrare i thread deadlock come spiegato in questa risposta - Deadlock detection in Java.

1

Non penso che ci sia qualcosa che verificherà definitivamente la sicurezza dei thread, ci sono alcuni strumenti che sono già stati menzionati, come findbugs che farà un lavoro ragionevole di trovare gli errori evidenti.

Spetta al programmatore assicurarsi che il loro programma non stia perdendo variabili o riferimenti in thread diversi e dove le cose vengano utilizzate in più thread assicurando che ogni thread veda il valore 'corretto'.

Progettato per la sicurezza prima delle prestazioni, è possibile che funzioni in modo soddisfacente per le proprie esigenze, ma se si aggiunge l'ottimizzazione aumentando la complessità e potenzialmente il guasto, potrebbe non essere il collo di bottiglia.

Consiglierei di leggere la lettura nello specifico Java Concurrency In Practice, potresti anche trovare utile Effective Java.

0

Più di un commento, ma un po 'troppo lungo.

Tramite la regola empirica, posso mettere una parola chiave sincronizzata su ogni metodo che tocca le variabili di classe.

Non proprio - Pensa ad esempio alla classe Vector: è sincronizzata, tuttavia l'iterazione richiede il blocco esterno. Un concorrente alernative è CopyOnWriteArrayList, ad esempio, che consente l'iterazione senza dover bloccare l'intera raccolta.

Bottom line come già risposto da altri: non è così semplice come aggiungere synchronized ovunque. È necessario analizzare con precisione il contratto della classe e assicurarsi che il contratto sia ancora soddisfatto in una situazione di multi-threading.

1

ThreadSafe (http://www.contemplateltd.com/threadsafe, prove gratuite disponibili) fa esattamente quello che la domanda richiede. Vedi questo InfoQ article per gli esempi di errori di concorrenza che trova nelle applicazioni open source inclusi Apache JMeter e K9Mail. Vedere Ivan Senic's blog per l'opinione di un utente. ThreadSafe's Wikipedia entry fornisce un breve sommario.

(Disclosure:. ThreadSafe è uno strumento commerciale, e io sono co-fondatore di contemplare, l'azienda che lo produce)