problemi di prestazioni durante la sincronizzazione su una stringa internata

2

Voglio bloccare un file remoto con la stringa "ip + filename" usando java.

public boolean execCmd(String ip,String filename, String command)
{
    String file = ip + filename;
    String lock = file.intern();

    try
    {
        synchronized (lock)
        {
            System.out.println(file + "get the lock");
            // ssh to remote machine and exec command
            System.out.println(file + "release the lock");
        }
    }
    catch(Exception e)
    {
    }
}

questa funzione è chiamata da multi-thread, ma ho trovato che l'esecuzione è un po 'lenta, sembra essere sequenziale anche per file diversi.

Ora il risultato è simile a questo:

file1 get the lock
file2 get the lock
file3 get the lock
file1 release the lock
file2 release the lock
file3 release the lock
file4 get the lock
file4 release the lock
file5 get the lock
file5 release the lock
file6 get the lock
file6 release the lock
...

i primi tre output di log sembrano essere concomitanti, ma il seguente task sembra essere sequenziale, ho provato per molte volte, il risultato è quasi lo stesso.

Questo è un risultato normale? o c'è qualcosa di sbagliato nel programma?

    
posta NingLee 07.11.2014 - 04:59
fonte

1 risposta

1

Il tuo codice è corretto, ma la sincronizzazione su String.intern () non è una buona idea.

A proposito, se vuoi bloccare il file nella macchina remota, puoi implementarlo nello script di shell. flock può essere un buon modo per bloccare un file in linux.

    
risposta data 10.11.2014 - 06:01
fonte

Leggi altre domande sui tag