Packagecom.example; Public classApp { Public Static voidMain (string[] args) {Info Info=NewInfo (); Readinfo RI=NewReadinfo (info); Writeinfo WI=NewWriteinfo (info); Thread T1=NewThread (ri, "Ri1"); Thread T2=NewThread (ri, "Ri2"); Thread T3=NewThread (ri, "Ri3"); Thread T4=NewThread (WI, "Wi1"); Thread T5=NewThread (WI, "Wi2"); T1.start (); T2.start (); T3.start (); T4.start (); T5.start (); }}
Packagecom.example;ImportJava.util.concurrent.locks.ReadWriteLock;ImportJava.util.concurrent.locks.ReentrantReadWriteLock; Public classInfo {Private intnum; //Readwritelock can be understood as a more granular management of synchronized PrivateReadwritelock Lock; PublicInfo () { This. num = 0; Lock=NewReentrantreadwritelock (); } Public intGetnum () {Lock.writelock (). Lock (); intOutput = This. Num; Lock.writelock (). Unlock (); returnoutput; } Public voidSetnum (intinput) {Lock.readlock (). Lock (); This. num =input; Lock.readlock (). Unlock (); } }
Packagecom.example; Public classReadinfoImplementsRunnable {PrivateInfo Info; PublicReadinfo (Info in) { This. info =In ; } @Override Public voidrun () { for(inti = 0; I < 10; i++) {System.out.println (Thread.CurrentThread (). GetName ()+ " " +info.getnum ()); Try{Thread.Sleep (1); } Catch(interruptedexception e) {e.printstacktrace (); } } }}
Packagecom.example; Public classWriteinfoImplementsRunnable {PrivateInfo Info; PublicWriteinfo (Info in) { This. info =In ; } @Override Public voidrun () { for(inti = 0; I < 10; i++) {Info.setnum (i+info.getnum ()); System.out.println (Thread.CurrentThread (). GetName ()+ "SetInfo:" +info.getnum ()); Try{Thread.Sleep (1); } Catch(interruptedexception e) {e.printstacktrace (); } } }}
Java Multithreading (Readwritelock)