如何选择是同步对象还是方法

时间:2018-11-09 09:01:51

标签: java multithreading concurrency synchronization

我在Internet上找到了这个同步示例,但我并不真正了解在这个特定示例中同步对象和方法之间的区别。这里的同步是在对象发送者上的。是否可以同步send方法并获得相同的结果?

// 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 :(得分:2)

在您的示例中,在对象上进行同步与将send方法声明为synchronized之间并没有什么区别。

但是通常,在对象上进行同步的优点是:

  1. 呼叫者可以选择是否同步。
  2. 调用者可以在同步块中放置其他代码,而不仅仅是对send方法的调用。 (例如,如果您想将调用同步到其他对象)。

方法同步的优点是:

  1. 同步是自动的,由调用的类确定。呼叫者不需要知道它。
  2. 您可以根据需要拥有同步和非同步的方法。