Jay*_*ani 0 java android synchronized
你可能会觉得这个问题是重复的这一个,但没有这个问题的答案可以帮助我了解synchronized在Android的方法。我在Google上搜索了很多synchronized方法,以了解方法,但找到了一些答案,但是它们没有帮助我完全理解Synchronized方法,因为没有答案有任何完美的实际例子。
我试图synchronized通过synchronized在代码中实现2个方法并同时执行它们来理解方法,但是我未能正确实现它们。因此,请synchronized以简单的例子提供方法的说明,像我这样的其他人也可以简单快速地理解它。
我不确定我是否朝正确的方向前进,但是我尝试了以下具有2个同步方法的代码。
synchronized void add() {
counter++;
Log.e("JK", String.valueOf(counter));
}
synchronized void minus() {
counter--;
Log.e("JK", String.valueOf(counter));
}
Run Code Online (Sandbox Code Playgroud)
我已经使用下面的代码在两个不同的线程中调用了此方法。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
synchronized (counter++) {
add();
}
}
},500);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
minus();
}
},1000);
Run Code Online (Sandbox Code Playgroud)
同步方法是一次只能由一个线程使用的方法。其他线程将等待,直到该方法将被释放。您应该仅出于严重的理由就将方法声明为已同步,因为这种方法会降低生产率。同步方法使用的经典情况是,当多个线程使用相同的资源时,即更改某个对象的状态,并且需要确保一次仅一个线程执行该操作,否则会导致不一致。还要确保使同步方法尽可能小,理想情况下应将其减少为仅包含可以操纵公共资源的操作。
例如,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;
}
}
Run Code Online (Sandbox Code Playgroud)
假设您是从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();
Run Code Online (Sandbox Code Playgroud)
同步方法的结果将如下所示:
<<<<<<<<<<>>>>>>>>>>
Message written by:John
Message content:Hi
<<<<<<<<<<>>>>>>>>>>
Message written by:Bill
Message content:Hello
Run Code Online (Sandbox Code Playgroud)
如果方法未同步,则多个线程可能会同时写入文件,这可能导致文件中的序列无法预测,如下所示:
<<<<<<<<<<>>>>>>>>>>
<<<<<<<<<<>>>>>>>>>>
Message written by:John
Message written by:Bill
Message content:Hello
Message content:Hi
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2676 次 |
| 最近记录: |