Как выбрать, синхронизировать ли объект или метод - PullRequest
0 голосов
/ 09 ноября 2018

Я нашел этот пример синхронизации в Интернете, и я не очень понимаю, в чем разница между синхронизацией объекта и методов в этом конкретном примере. Здесь синхронизация находится на отправителе объекта; Можно ли было синхронизировать метод отправки и получить тот же результат?

// A Java program to demonstrate working of 
// synchronized. 
import java.io.*; 
import java.util.*; 

// A Class used to send a message 
class Sender 
{ 
    public void send(String msg) 
    { 
        System.out.println("Sending\t"  + msg ); 
        try
        { 
            Thread.sleep(1000); 
        } 
        catch (Exception e) 
        { 
            System.out.println("Thread  interrupted."); 
        } 
        System.out.println("\n" + msg + "Sent"); 
    } 
} 

// Class for send a message using Threads 
class ThreadedSend extends Thread 
{ 
    private String msg; 
    private Thread t; 
    Sender  sender; 

    // Recieves a message object and a string 
    // message to be sent 
    ThreadedSend(String m,  Sender obj) 
    { 
        msg = m; 
        sender = obj; 
    } 

    public void run() 
    { 
        // Only one thread can send a message 
        // at a time. 
        synchronized(sender) 
        { 
            // synchronizing the snd object 
            sender.send(msg); 
        } 
    } 
} 

// Driver class 
class SyncDemo 
{ 
    public static void main(String args[]) 
    { 
        Sender snd = new Sender(); 
        ThreadedSend S1 = 
            new ThreadedSend( " Hi " , snd ); 
        ThreadedSend S2 = 
            new ThreadedSend( " Bye " , snd ); 

        // Start two threads of ThreadedSend type 
        S1.start(); 
        S2.start(); 

        // wait for threads to end 
        try
        { 
            S1.join(); 
            S2.join(); 
        } 
        catch(Exception e) 
        { 
             System.out.println("Interrupted"); 
        } 
    } 
} 

1 Ответ

0 голосов
/ 09 ноября 2018

В вашем примере нет никакой разницы между синхронизацией объекта и объявлением метода отправки как synchronized.

Но в целом преимущества синхронизации на объекте таковы:

  1. Абонент может выбрать, синхронизировать или нет.
  2. Вызывающий может разместить дополнительный код в синхронизированном блоке, а не только вызов метода send. (Например, если вы хотите синхронизировать звонки с разными объектами).

Преимущества синхронизации по методу:

  1. Синхронизация выполняется автоматически и определяется вызываемым классом. Звонившему не нужно знать об этом.
  2. При необходимости вы можете использовать синхронизированные и несинхронизированные методы.
...