[解決済み] javaのsynchronizedキーワードのC#版?
2022-03-17 21:01:07
質問
c#はJavaの"synchronized"キーワードの独自のバージョンを持っていますか?
つまり、javaでは、関数、オブジェクト、コードブロックのいずれかに指定することができる、ということです。
public synchronized void doImportantStuff() {
// dangerous code goes here.
}
または
public void doImportantStuff() {
// trivial stuff
synchronized(someLock) {
// dangerous code goes here.
}
}
解決方法は?
第一に、ほとんどのクラスはスレッドセーフである必要はありません。使用方法 YAGNI スレッドセーフを適用するのは、実際に使用する(そしてテストする)ことが分かっているときだけにしてください。
メソッドレベルのものについては
[MethodImpl]
:
[MethodImpl(MethodImplOptions.Synchronized)]
public void SomeMethod() {/* code */}
これは、アクセサ(プロパティやイベント)にも使用できます。
private int i;
public int SomeProperty
{
[MethodImpl(MethodImplOptions.Synchronized)]
get { return i; }
[MethodImpl(MethodImplOptions.Synchronized)]
set { i = value; }
}
なお、フィールドのようなイベント は はデフォルトで同期化されていますが、自動実装のプロパティは はありません。 :
public int SomeProperty {get;set;} // not synchronized
public event EventHandler SomeEvent; // synchronized
個人的に、私は
MethodImpl
をロックしてしまうので
this
または
typeof(Foo)
- これはベストプラクティスに反しています。望ましいのは、独自のロックを使用することです。
private readonly object syncLock = new object();
public void SomeMethod() {
lock(syncLock) { /* code */ }
}
フィールドライクイベントの場合、ロックの実装はコンパイラに依存することに注意してください。古い Microsoft コンパイラでは
lock(this)
/
lock(Type)
- が、しかし
最近のコンパイラでは
Interlocked
を更新することで、厄介な部分なしにスレッドセーフを実現しています。
これにより、よりきめ細かい使い方が可能になり
Monitor.Wait
/
Monitor.Pulse
などで、スレッド間の通信を行います。
関連
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] Try-catchは私のコードをスピードアップさせるか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] Javaで汎用配列を作成する方法は?
-
[解決済み] シンクロナイズド」とはどういう意味ですか?
-
[解決済み] Eclipseが起動できない - Javaは起動したが終了コード=13を返した
-
[解決済み] Javaの "final "キーワードはどのように機能するのでしょうか?(オブジェクトを修正することは可能です。)
-
[解決済み] Javaでsynchronized(this)を避けるには?
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】プログラミングにおける「atomic」の意味とは?