安卓中的同步方法更新

2022-09-04 05:28:14

你可能会认为这个问题与这个问题重复,但这个问题的答案没有帮助我理解Android中的方法。我在谷歌上搜索了很多理解方法,我找到了一些答案,但他们并没有帮助我完全理解方法,因为没有答案有任何完美的实际例子。synchronizedsynchronizedSynchronized

我试图通过在我的代码中实现2种方法并同时执行它们来理解方法,但我未能正确实现它们。因此,请用简单的例子提供方法的解释,以便像我这样的其他人也可以简单,更快地理解它。synchronizedsynchronizedsynchronized

更新

我不确定我是否朝着正确的方向前进,但我尝试了以下代码,其中有2个同步方法。

synchronized void add() {
    counter++;
    Log.e("JK", String.valueOf(counter));
}

synchronized void minus() {
    counter--;
    Log.e("JK", String.valueOf(counter));
}

并且我使用以下代码在两个不同的线程中调用了此方法。

new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    synchronized (counter++) {
                        add();
                    }
                }
            },500);
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    minus();
                }
            },1000);

答案 1

同步方法是一次只能由一个线程使用的方法。其他线程将等待该方法被释放。您应该只有严肃的理由将方法声明为同步,因为这种方法会降低工作效率。同步方法使用的经典情况是当多个线程使用相同的资源时,即更改某个对象的状态,并且需要确保一次只有一个线程执行它,否则会导致不一致。还要确保使同步方法尽可能小,理想情况下将其减少到仅包含可以操作公共资源的操作。

例如,类报告器具有公共资源文件Writer。它写入一些包含作者信息的消息。

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

答案 2

同步方法是一次只能由一个线程使用的方法。其他线程将等待该方法被释放。您只应有正当理由将方法声明为已同步,因为此类方法会降低工作效率和性能。


推荐