作者:风雨无痕630_748 | 来源:互联网 | 2022-12-02 16:28
1> GiorgosDev..:
同步方法是一次只能由一个线程使用的方法。其他线程将等待,直到该方法将被释放。您应该仅出于严重的理由就将方法声明为已同步,因为这种方法会降低生产率。同步方法使用的经典情况是,当多个线程使用相同的资源时,即更改某个对象的状态,并且需要确保一次仅一个线程执行该操作,否则会导致不一致。还要确保使同步方法尽可能小,理想情况下应将其减少为仅包含可以操纵公共资源的操作。
例如,Reporter类具有公共资源fileWriter。它写入一些消息,其中包含有关作者的信息。
class Reporter{
private FileWriter fileWriter;
public synchronized void addRecord(String author, String message) throws IOException {
fileWriter.write("\n<<<<<<<<<<>>>>>>>>>>\n");
fileWriter.write("Message written by:" + author + "\n");
fileWriter.write("Message content:" + message);
}
public Reporter(FileWriter fileWriter) {
this.fileWriter = fileWriter;
}
}
假设您是从2个不同的线程运行此代码的:
Reporter reporter = new Reporter("path/report");
...
Thread thread = new Thread(){
public void run(){
reporter.addRecord("John", "Hi");
}
}
thread.start();
Thread thread2 = new Thread(){
public void run(){
reporter.addRecord("Bill", "Hello");
}
}
thread2.start();
同步方法的结果将如下所示:
<<<<<<<<<<>>>>>>>>>>
Message written by:John
Message content:Hi
<<<<<<<<<<>>>>>>>>>>
Message written by:Bill
Message content:Hello
如果方法未同步,则多个线程可能会同时写入文件,这可能导致文件中的序列无法预测,如下所示:
<<<<<<<<<<>>>>>>>>>>
<<<<<<<<<<>>>>>>>>>>
Message written by:John
Message written by:Bill
Message content:Hello
Message content:Hi