java - android中的同步方法

标签 java android synchronized

您可能认为这个问题与 this 重复。该问题的一个但没有答案有助于我理解synchronized安卓中的方法。我在google上搜索了很多以了解synchronized方法,我找到了一些答案,但它们并没有帮助我完全理解 Synchronized方法,因为没有答案有任何完美的实际例子。
我试图理解synchronized方法2 synchronized我的代码中的方法并同时执行它们,但我未能正确实现它们。所以,请提供synchronized的解释使用 的方法简单示例所以,像我这样的其他人也可以简单快速地理解它。
更新
我不确定我是否朝着正确的方向前进,但我尝试了以下具有 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);

最佳答案

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

例如 Reporter 类有公共(public)资源 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

关于java - android中的同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52738620/

相关文章:

java - 我的 N-Queens 解决方案有什么问题?

java - 为什么不是遥不可及呢?

java - 如何使用 JavaHg Mercurial API 启用 "largefiles"扩展?

android - 通过 USB 连接的 Android 设备控制 Raspberry Pi

Java:这是否正确暂停线程?

java - 如何在不更改任何一组的情况下找到两组之间的差异?

android - 使用android studio时如何在App中加入Material Design?

php - Android 无法将图像上传到服务器。图片类型错误

java - 我应该同步构造函数吗?

java - Scala/Java 中的等价锁?