Ich habe faire und nicht faire Disziplinen über RentrantLock
getestet. Ich habe ein kleines Programm geschrieben, das Dining-Philosophen simuliert.
Jeder Philospher hat links und rechts die Gabel, die ReentrantLock
s sind. Ich habe 1000 mal Tat des Denkens und Essens simuliert:
wobei act
Think
ist nicht interessant, es schläft nur für eine gewisse Zeit. Hier ist eat
Methode
Hauptmethode:
%Vor% Nachdem alle 5 Fäden fertig sind, drucke ich für jeden Philosophen eatCount. Und diese Werte unterscheiden sich nicht zu sehr für faire ( new ReentrantLock(true)
) und unfaire ( new ReentrantLock()
) Disziplin.
(erste Zahl ist eine Nummer eines Philosphers)
Fair lock:
%Vor%Unfair Lock:
%Vor%Ich habe etwas Hunger für unfaire Sperre erwartet, ich meine, einige Philosophen / Philosophen müssen essenCount viel größer als andere, aber Hunger hat nicht stattgefunden. Warum?
Der Thread, der eine Sperre freigibt, hat eine viel größere Chance, die Sperre wiederzuerlangen, während die anderen Threads blockiert sind. Belegtes Warten zeigt dies nicht, da jeder Thread die gleiche Chance hat, das Schloss zu greifen. Möglicherweise könnte derjenige, der das Schloss freigibt, einen leichten Nachteil haben.
%Vor%druckt
%Vor%Aber wenn ich die Sperre fair mache, sehe ich
%Vor%@Maks, haben Sie versucht, zufällige Werte für EAT_TIME zu setzen?
Dies könnte der Logik einige Ungerechtigkeiten bringen.
Tags und Links java multithreading