Je suis novice en multithreading, et j'ai écrit ce code qui imprime les nombres 1-10000 en ayant des threads en cours d'exécution incrémenter et imprimer une variable.Est-ce que 'synchronisé' est vraiment du sucre syntaxique?
Voici le code que je utilise:
package threadtest;
public class Main{
static int i=0;
static Object lock=new Object();
private static class Incrementer extends Thread{
@Override
public void run(){
while (true){
synchronized(lock){
if (i>=10000)
break;
i++;
System.out.println(i);
}
}
}
}
public static void main(String[] args) {
new Incrementer().start();
new Incrementer().start();
new Incrementer().start();
new Incrementer().start();
new Incrementer().start();
new Incrementer().start();
}
}
Cela fonctionne - je l'ai écrit un programme de test pour vérifier la sortie et les numéros imprimés sont exactement 1-10000 dans l'ordre.
Ma question est la suivante: J'ai entendu dire que synchronized
est seulement du sucre syntaxique. Mais je n'arrive pas à atteindre un résultat réussi sans l'utiliser. Qu'est-ce que je rate?
Ce n'est certainement pas le cas. Pouvez-vous citer les sources où vous avez entendu cela? – BalusC
@BalusC: Voir la réponse acceptée. Je pense que les sources se référaient simplement aux méthodes synchronisées * comme sucre syntaxique - je ne suis pas sûr que ce soit exact ou pas, mais au moins cela ne contredit pas mes conclusions comme je le pensais. @skaffman: J'aurais pu mal le faire sans 'synchronized' pour tout ce que je savais :) – Cam
@incrediman' synchronized' sur une méthode est plus ou moins la même chose que mettre le corps de la méthode dans 'synchronized (this) {...} '(ou pour une méthode statique' synchronized (MyClass.class) {...} '). (Il est représenté différemment dans les fichiers de classe, mais cela ne devrait normalement pas vous inquiéter.) –