我在互联网上找到了这个同步示例,我真的不明白同步对象和这个特定示例中的方法之间的区别。这里的同步是在对象发送器上;有可能同步发送方法并获得相同的结果吗?
// 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
之间实际上没有任何区别。
但一般来说,在对象上同步的优点是:
- 调用者可以选择是否同步
- 调用者可以在同步块中放置额外的代码,而不仅仅是对send方法的调用。(例如,如果要同步对不同对象的调用(
同步方法的优点是:
- 同步是自动的,由调用的类决定。打电话的人不需要知道这件事
- 您可以根据需要使用同步和非同步方法