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



我在互联网上找到了这个同步示例,我真的不明白同步对象和这个特定示例中的方法之间的区别。这里的同步是在对象发送器上;有可能同步发送方法并获得相同的结果吗?

// 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("Sendingt"  + 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之间实际上没有任何区别。

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

  1. 调用者可以选择是否同步
  2. 调用者可以在同步块中放置额外的代码,而不仅仅是对send方法的调用。(例如,如果要同步对不同对象的调用(

同步方法的优点是:

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

最新更新