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

Java 如何选择是同步对象还是同步方法,java,multithreading,concurrency,synchronization,Java,Multithreading,Concurrency,Synchronization,我在Internet上找到了这个同步示例,但我并不真正理解在这个特定示例中同步对象和方法之间的区别。在这里,同步是在对象发送方上进行的;是否可以同步发送方法并获得相同的结果 // A Java program to demonstrate working of // synchronized. import java.io.*; import java.util.*; // A Class used to send a message class Sender { pub

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

// 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"); 
        } 
    } 
} 

在您的示例中,在对象上同步与将send方法声明为
synchronized
之间实际上没有任何区别

但一般来说,在对象上同步的优点是:

  • 调用者可以选择是否同步
  • 调用方可以在synchronized块中放置额外的代码,而不仅仅是对send方法的调用。(例如,如果要同步对不同对象的调用)
  • 在该方法上同步的优点是:

  • 同步是自动的,由被调用的类决定。打电话的人不需要知道这件事
  • 您可以根据需要使用同步和非同步方法

  • 在这种情况下,对
    sender
    对象的访问将不是线程安全的。但是,在这种情况下,sender对象只实现了1个方法,所以它是相同的,对吗?没错!