web-dev-qa-db-ja.com

Javaで「同期」とはどういう意味ですか?

私はデザインパターンを学ぼうと努力しています。 このサイトsynchronizedキーワードを使用していますが、その意味がわかりません。

私はネットで検索したところ、マルチスレッドとメモリに多少関係していることがわかりましたが、私は機械エンジニアであり、その意味がわかりません。

スレッドとsynchronizedキーワードを理解するのを手伝ってくれませんか?

23
Cool_Coder

C++にはsynchronizedキーワードはありません。

ただし、Javaには1つあり、メソッドの場合 次の2つを意味します

  • 同じオブジェクト上の同期メソッドの2つの呼び出しをインターリーブすることはできません。 1つのスレッドがオブジェクトの同期メソッドを実行しているとき、同じオブジェクトの同期メソッドを呼び出す他のすべてのスレッドは、最初のスレッドがオブジェクトで完了するまでブロックします(実行を中断します)。
  • 同期されたメソッドが終了すると、同じオブジェクトに対する同期されたメソッドの後続の呼び出しとの前に発生する関係が自動的に確立されます。これにより、オブジェクトの状態の変更がすべてのスレッドから見えるようになります。

同様のルールが任意のブロックに適用されます

また、権威のない恣意的なWebサイトではなく、査読済みの本から学ぶことをお勧めします。

(Java)の例

public static synchronized Singleton getInstance()

つまり、一度に1つのスレッドのみがgetInstance()メソッドにアクセスできるようにして、競合状態を回避する必要があります。

20
AndersK

コメンターがすでに指摘したように、同期はJavaキーワードです。

つまり、2つのスレッドが同時にメソッドを実行することはできず、JVMがそれを強制します。

C++では、クリティカルセクションやミューテックスなどの同期コンストラクトを使用する必要があります。 this を参照してください。

6
PRouleau

1つのスレッドがデータを読み取ろうとし、他のスレッドが同じデータを更新しようとすると、不整合な状態になります。

これは、データへのアクセスを同期させることで防ぐことができます。 “ synchronized”メソッドを使用:

 public synchronized void update()
 {
 …
 }
5
csandreas1