Je jouais avec les Perturbateurs cadre et de son port .NET plate-forme et a trouvé un cas intéressant. Peut-être que je passe à côté de quelque chose, donc je suis à la recherche de l'aide du tout-puissant de la Communauté.
long iterations = 500*1000*1000;
long testValue = 1;
//.NET 4.0. Release build. Mean time - 26 secs;
object lockObject = new object();
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
lock (lockObject)
{
testValue++;
}
}
sw.Stop();
//Java 6.25. Default JVM params. Mean time - 17 secs.
Object lock = new Object();
long start = System.currentTimeMillis();
for (int i = 0; i < iterations; i++)
{
synchronized (lock)
{
testValue++;
}
}
long stop = System.currentTimeMillis();
Il semble que l'acquisition du verrou dans le scénario avec un signle fil dans .Les coûts NETS de seulement 50% de plus qu'en Java. J'ai d'abord été suspect à des minuteries, mais j'ai couru le même test pour quelques temps avec des résultats autour mentionné ci-dessus des valeurs moyennes. Ensuite, j'ai été suspect à synchronisée bloc de code, mais il n'est rien de plus qu' monitorenter / monitorexit octet code d'instructions - la même chose que le verrouillage de mot-clé dans .NET. Toutes les autres idées pourquoi prendre un verrou est si cher dans l' .NET vs Java?