Questi sono entrambi usando blocchi intrinseci. Il tuo primo esempio è usare il blocco intrinseco di lock
, mentre il secondo sta usando il blocco intrinseco di this
. La domanda è se this
è davvero quello che vuoi bloccare, cosa che spesso non lo è.
Considera il caso, quando usi synchronized(this)
All'interno di uno dei tuoi metodi. Hai 2 oggetti di questa classe e questi oggetti fanno riferimento a alcune risorse condivise. Se si blocca this
Quindi non avrai esclusività reciproca a quella risorsa. È necessario bloccare un oggetto a cui tutto ciò che può accedere alla risorsa ha accesso.
Blocco su this
Solo se la risorsa importante fa parte della classe stessa. Anche allora in alcuni casi un oggetto di blocco è migliore. Inoltre, se ci sono diverse risorse nella tua classe, che non devono essere reciprocamente esclusive nel loro insieme, ma individualmente, è necessario diversi oggetti di blocco.
La chiave è solo sapere come sincronizzato funziona e sii consapevole di ciò che il tuo codice sta effettivamente facendo