シェアする

  • このエントリーをはてなブックマークに追加





【java】synchronizedはどんな時に使うの?

シェアする

  • このエントリーをはてなブックマークに追加
  • 0

synchronizedはどんな時に使うの?ということで、
これまで仕事ではなかなか登場させる機会がありませんでしたので、
いまさらではありますが、今回はjavaのsychronizedを触れてみようと思いました。

synchronizedって?

マルチスレッド処理における排他が必要な処理にて使用します。
synchronizedをつけることによって、あるスレッドがメソッド(またはブロック)を
処理している間、他のスレッドは処理が終わるまで待機することになります。

実際にやってみよう

まず、スレッドにて処理される以下ようなクラスを作成します。

やっていることは単純です。
クラス変数として合計値のフィールドをもっており、
addメソッドに渡された引数を足しこんでいくというものです。

次に以下のように実際にスレッドを生成してThreadExecutorクラスを実行する
クラスを作成します。

まずはsyncrhonizedをつけないとどうなるのか?

ThreadExecutorクラスのaddメソッドに上記サンプルではsynchronizedがついてますね。
まずはこれをつけないとどうなるのか?

結果はこうなります。

これはまずいですね。
例えばtotalの変数値が自分の銀行口座だとして考えてみましょう。
2箇所のATMから同時にこの口座に1000円ずつ10回お金を振り込んだ
というようなイメージだとわかりやすいかと思います。

本来であれば、20000にならないとおかしいですが、
排他をかけず2つのスレッドがほぼ同時に処理してしまっているので、
合計値の更新がうまくできていないですね。

それではsyncrhonizedをつけてみましょう。

結果はこうなります。

しっかり排他がかかっていて、正しく更新されていますね。

まとめ

このようにsynchronizedをメソッドに付与してあげることで、
処理に排他がかかるということがわかりました。

ブログランキング・にほんブログ村へ
にほんブログ村


人気ブログランキング

20代前半までは東京で音楽をやりながら両手の指以上の業種でアルバイト生活をしていましたが、某大手プロバイダのテレアポのバイトでPCの知識の無さに愕然とし、コンピュータをもっと知りたい!と思ったことをきっかけに25歳の時にITの世界に未経験で飛び込みました。
紆余曲折を経て、現在は個人事業主としてお仕事させていただいており、10年ほどになります。
web制作から企業システム構築、ツール開発など、フロントエンドもバックエンドもサーバーもDBAも依頼があれば何でもやってきた雑食系エンジニアです。

今風にいうとフルスタックエンジニアということになるのかしら??

→ 詳細プロフィールというか、生い立ちはこちら

→スキルシートをご覧になる場合はこちら

→お仕事のご依頼やお見積りなどお問い合わせはこちらから!

シェアする

  • このエントリーをはてなブックマークに追加

フォローはいかがですか?