Locke et écriture des verrous divisés en verrous en lecture et en verrouillage d'écriture, plusieurs verrous en lecture ne réprimande pas, lisent les verrous et écrivent des verrous mutuellement exclusifs, qui est contrôlé par JVM lui-même. Si votre code ne lit que les données, de nombreuses personnes peuvent lire en même temps, mais ne peuvent pas écrire en même temps, puis lisez le verrou; si votre code modifie les données, vous ne pouvez écrire qu'une personne et ne pas lire en même temps , alors écrivez l'essence de verrouillage En bref, lisez le verrou en lisant et écrivez le verrou lorsque vous écrivez!
Trois threads lisent les données, trois threads écrivent des données Exemple:
Vous pouvez lire en même temps, vous ne pouvez pas l'écrire en même temps, vous ne pouvez pas écrire en même temps et vous ne pouvez pas le lire lors de l'écriture.
Lisez le verrou lorsque vous lisez, lisez le déverrouillage; Écrivez le verrou lorsque vous écrivez et le déverrouillage.
Faites attention pour enfin déverrouiller.
package com.ljq.test.thread; Public static void main (String [] args) {final readwrite rw = new readwrite (); {rw.read ();}} .start (); ();}}} / ** * lire et écrire mutuellement exclusif, donc les mettre dans la même classe * * @Authouse Administrator * * / class ReadWrite {private Object Data = Null; Les données, mais il y a plusieurs threads pour lire les données en même temps. Readwritelock rwl = new reentRanTreadWrELOCK (); .Sleep ((long) (math.random () * 1000)); {e.PrintStackTrace ();} Enfin {rwl.readlock (). (); Essayez {System.out.println (Thread.CurrentThread (). .println (Thread.CurrentThread (). GetName () "Ayez des données d'écriture:" + Data);
Concevoir un système de cache de cache: Si vous devez prendre les données, vous devez appeler ma méthode de GetData (clé de chaîne). , quelqu'un viendra sur ces données la prochaine fois, et je renverrai ce numéro directement sans les trouver dans la base de données. Ne trouvez pas la base de données pour les données, venez à moi.
package com.ljq.test.thread; Système * * * @Author Administrator * * / public class Cachedemo {Private Map <String, Object> Cache = new HashMap <String, Object> (); ; De Caching} ReadWriteLock privé Rwl = new reentrantaReadwriteLock (); / Vérifiez d'abord s'il y a une valeur dans la mémoire interne si (valeur == null) {// sinon, consultez la base de données pour accéder à la base de données et enregistrez les résultats trouvés dans la mémoire interne // Libérez le verrouillage de lecture , écrivez un verrouillage rwl.readlock (). Out.println ("Lire les données de la base de données"); Unlock ();} // rw pour restaurer l'état de lecture et d'écriture rwl.readlock (). valeur;}}
Résultats du dos: