2017-01-20 8 views
0

私はある状態を持つクラスのオブジェクトを持っています。 このオブジェクトには2つの方法(method1()およびmethod2())があり、両方ともobjの状態が変更されています。 method1()は同期されていますが、method2()は同期されていません。クラスレベルの同期化はどのようにJavaに実装されていますか?

今2つのスレッド、スレッド1とthreads2アプローチオブジェクト - > を同期さmethod1()を呼び出しthreads1 - >同期化されていないmethod2()を呼び出すスレッド2。

私のテスト結果で見つかったのは、がロックを保持していても、method2()が正しく実行されていたことです。しかし、synchronizedキーワードをメソッドに置くことによって、オブジェクト全体でロックが取得された場合、実行可能なメソッドがいくつあるか考えました。それは待つべきです。

あなたの意見は高く評価されます。

+2

あなたは間違っていました。 'method2'は同期されていないので、ロックを獲得しようとはしません。これはロックがすでに' method1'によって獲得されていればブロックされます。 – Kayaman

+0

いくつかのコードは良いでしょう。 –

+0

@ケイマン私は今私のために働いていることがわかりました。ありがとう –

答えて

2

同期メソッドまたはブロックを呼び出すとロックが発生するとは、スレッドが排他的にロックを取得したということです。これは、取得したスレッドのロックが他の保護を受けているオブジェクトの状態を意味するものではありません。

(固有ロックは言語設計者によって利便性として、クラスオブジェクトを含む、オブジェクトに添付されている。この決定は、最高の一つとなっていない可能性があります。ロックオンするために、専用のオブジェクトを使用すると、通常は良いアイデアです。)

同期化されていないコールが共有状態を壊している可能性があります。これに加えて、メモリバリアが配置されず、非同期メソッドを呼び出すスレッドによって加えられた変更が他のスレッドによって見られないことがあります。 JITは、コードの並べ替えなどの最適化を行う際に、スレッド間の可視性の問題を考慮しません。

適切に同期されていないコードで何が起こるかを予測するのは難しいでしょう。

1

しかし、オブジェクトにロックをつけると、他の方法を実行する方法よりもメソッドに同期を取ると思っていました。それは待つべきです。

ロックには何がロックされているかわかりません。他のスレッドが同じロックを取得できないようにするだけです。

1

ここでいくつかの良い答えがありましたが、もう少し詳しく説明していたと思います。

私のテスト結果には、method1()がロックしていても、method2()がうまく実行されていることが分かります。

スレッドが​​メソッドに入ると、スレッドはオブジェクトインスタンスに関連付けられたモニタをロックします。他のスレッドは、同じオブジェクトインスタンス上の他の非同期メソッドを好きなだけ呼び出すことができます。 thread1が保持しているロックは、決してobjを変更しません。 thread2でもがロックする場合は、と同じオブジェクトインスタンスがブロックされます。

しかし、私は、もしロックが他の方法を実行することができる方法よりも、この方法で同期を置くことによって、オブジェクト全体に取得していることを考えました。それは待つべきです。

いいえ、これは該当しません。すべてのメソッド呼び出しで、メソッドが呼び出されたオブジェクトにロックがあるかどうかを確認する必要がある場合は、大きなパフォーマンスが発生します。

関連する問題