synchronized

synchronized.png

javaにsynchronizedというキーワードがありますが、
複数のスレッドが、同じ資源に同時にアクセスすることを防ぐために存在します。
オブジェクトにロックをかけるとも言いますし
スレッドの排他制御とも言います。

ある特定のオブジェクトの同期を取る場合

 synchronized (オブジェクト名) {
            System.out.print("この括弧{の内側は、ひとつのスレッドしか入れないよ!!");
            System.out.print("あとから他のスレッドが来ても、「使用中」で入れなくするよ!");
        }

要はsynchronized(オブジェクト名)とすることで、そのオブジェクトをトイレのような存在にするということです。
一人が入ったら、他の人は入れない。
空いたら、誰か一人入れる

1つのスレッドだけがある時点で1つのメソッドやブロックを実行していることを保証します

複数のオブジェクトの同期をとりたい。

1個のオブジェクトだけじゃなくて、あれもこれも、ロックをかけたい!場合はどうすればいいのか?
やりたいことはこうだけど、こんな方法はコンパイルが通らない

synchronized(player, field) {
    // code
}

手段その1:入れ子にする

synchronized(a){
   synchronized(b){
  }
}

しかしこれはあんまりよくないらしい

手段その2:ロック用のオブジェクトを作る

そして、複数アクセスの発生しうる場所をすべてそれでロックするという方法

public class Field {
 
  private Object lock = new Object();
 
  public removePlayer(Player p) {
    synchronized ( lock) {
      players.remove(p);
      p.setField(null);
    }
  }
 
  public addPlayer(Player p) {
    synchronized ( lock) {
      players.add(p);
      p.setField(this);
    }
  }
}

java-keyword multithread speed

サポートサイト Wikidot.com java-keywordmultithreadspeed