質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

5821閲覧

【Spring】@AutowiredでDIされるインスタンスが複数リクエストに対応する際、インスタンスはシングルトンを維持できているのでしょうか

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2019/06/12 05:12

編集2019/06/12 06:38

質問詳細

Spring Bootの @Autowired でDIされるインスタンスはシングルトンであるとの認識ですが、それが時間がかかる処理を行っているとき、インスタンスはシングルトンを維持できているのでしょうか。
またそうでない場合は実際にメモリ上でインスタンスはどのような挙動になっているのでしょうか。

コード例

Java

1@RestController 2@RequestMapping("api") 3public class TestController { 4 5 @Autowired 6 TestService testService; 7 8 @RequestMapping(value = "", method = RequestMethod.GET) 9 public Map<String, Object> test() { 10 11 val resultMap = new HashMap<String, Object>(); 12 13 // 下記処理を実行するのに時間がかかる 14 // 処理が終わらないうちに次のリクエストがとんでくる想定 15 val result = testService.omoi(); 16 17 resultMap.put("result",result); 18 return resultMap; 19 20 } 21 22}

試したこと

DIしたserviceのメソッドでThread.sleep(10000)を行っている最中に新規リクエストを実行したところ、
新規リクエストにおいても遅延なくDIしたserviceのメソッドが呼び出された。

疑問点

シングルトンのインスタンスが処理中なのに、なぜ新規リクエストの同インスタンスを用いた処理が待ちにならないのか分からない。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/06/12 05:14

コードの具体例を出されたほうが良いかと思います
退会済みユーザー

退会済みユーザー

2019/06/12 05:25

そういう実装を行えばそうなる
退会済みユーザー

退会済みユーザー

2019/06/12 05:54

コードを追記しました。
m.ts10806

2019/06/12 05:57

>処理が終わらないうちに次のリクエスト これはどこからどのように飛んでくるのでしょうか。
退会済みユーザー

退会済みユーザー

2019/06/12 06:01

当コードTestControllerのメソッドに対してRESTで飛んでくる想定です。
m.ts10806

2019/06/12 06:04

それって実際に試してみたら分かることってないですか?
退会済みユーザー

退会済みユーザー

2019/06/12 06:15

試したこと、疑問点を追記しました。
退会済みユーザー

退会済みユーザー

2019/06/12 06:31

質問:@AutowiredでDIされるインスタンスは、それが処理中の場合、DIを利用する他の処理は待ちになりますか 試したこと:新規リクエストにおいても遅延なくDIしたserviceのメソッドが呼び出された。 質問に対する回答はすでに質問で簡潔したね
退会済みユーザー

退会済みユーザー

2019/06/12 06:39

質問のタイトル、詳細を修正しました。
guest

回答1

0

ベストアンサー

Thread.sleep(millis) のJavadoc https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Thread.html#sleep-long-int- も参考にしていただきたいのですが、

現在実行中のスレッドを、指定されたミリ秒数の間、スリープ(一時的に実行を停止)させます。

SpringMVCやコンテナの設定次第なところなのですが、デフォルトではControllerは複数スレッド(初期値は10)で実行されます。
なので @AutowiredのbeanのScopeがSingletonであっても複数スレッドからのアクセスがありうるので、例えば1つのスレッドが待機中でも他のスレッドが実行可能です。

なお、Thread.sleep を使わずとも、Singletonのbeanに対しての作用を確認する方法として、IDEのデバッグ機能を利用して、当該beanのメソッド内でブレークポイントを設置してから、Webブラウザやcurlから複数のリクエストを同時に発行させることで動作確認ができるでしょう。

投稿2019/06/13 04:07

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/14 04:19

丁寧なご回答ありがとうございます。 複数スレッドがSingletonの同一インスタンスを利用する場合、あるスレッドが利用するSingletonインスタンスの処理が次のスレッドの処理までに間に合わないとしても、Singletonインスタンスはコピーされる等して処理を行える状態にあるという理解でよろしいでしょうか。
退会済みユーザー

退会済みユーザー

2019/06/14 05:45

singleton と synchronized をごっちゃにしてそうだね
退会済みユーザー

退会済みユーザー

2019/06/14 06:10

それらの混同はしていないつもりですが、 複数スレッドが同一インスタンスを用いた処理を行う際にメモリ上でSingletonインスタンスがどのような挙動になるのかがとにかくわかりません。 スレッドとSIngletonインスタンス間のメモリ上の関係がわかる文書があればご教示していただきたいです...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問