Quel est le but de passage de paramètre de bloc synchronisé?

Je sais que

Lorsque vous synchronisez un bloc de code, vous spécifiez l'objet de verrouillage
vous souhaitez utiliser en tant que le verrouillage, de sorte que vous pouvez, par exemple, l'utilisation de certains
la troisième partie de l'objet de la serrure pour ce morceau de code. Qui vous donne
la possibilité d'avoir plus d'une serrure de code de synchronisation dans
un objet unique.

Cependant, je ne comprends pas la nécessité de passer des arguments à la bloquer. Parce qu'il n'a pas d'importance si je passe de la Chaîne d'exemple, Certains aléatoire de la classe de l'instance de la synchronisation de bloc le bloc synchronisé fonctionne parfaitement quel que soit le paramètre passé au bloc.

Donc ma question est si de toute façon synchronisée bloc s'arrête à deux threads d'entrer dans la section critique simultanément. Alors, pourquoi il est nécessaire de passer un argument. (Je veux dire acquérir verrouillage sur certains objet aléatoire par défaut).

J'espère que j'ai encadré ma question correctement.

J'ai essayé l'exemple suivant avec des paramètres aléatoires cours de la synchronisation de bloc.

public class Launcher {

    public static void main(String[] args) {
        AccountOperations accOps=new AccountOperations();

        Thread lucy=new Thread(accOps,"Lucy");
        Thread sam=new Thread(accOps,"Sam");

        lucy.start();
        sam.start();

    }

}

À l'aide de non-synchronisée statique bloc:

public class AccountOperations implements Runnable{
    private  Account account = new Account();


    public void run(){

        for(int i=0;i<5;i++){

            makeWithdrawal(10);                 
        }
    }

    public  void makeWithdrawal(int amount){
        String str="asd"
        synchronized (str /* pass any non-null object the synchronized block works*/) {
            if(account.getAmount()>10){

                try{
                    Thread.sleep(5000);             
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
                account.withdraw(amount);
                System.out.println(Thread.currentThread().getName()+" has withdrawn 10, current balance "+ account.getAmount());
            }else{
                System.out.println("Insufficient funds "+account.getAmount());
            }
        }

    }

}

À l'aide synchronisée statique bloc:

public class AccountOperations implements Runnable{
    private static Account account = new Account();


    public void run(){

        for(int i=0;i<5;i++){

            makeWithdrawal(10);                 
        }
    }

    public static void makeWithdrawal(int amount){

        synchronized (String.class /* pass any class literal synchronized block works*/) {
            if(account.getAmount()>10){

                try{
                    Thread.sleep(5000);             
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
                account.withdraw(amount);
                System.out.println(Thread.currentThread().getName()+" has withdrawn 10, current balance "+ account.getAmount());
            }else{
                System.out.println("Insufficient funds "+account.getAmount());
            }
        }

    }

}
InformationsquelleAutor John Rambo | 2015-04-26