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

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

新規登録して質問してみよう
ただいま回答率
85.48%
排他制御

排他制御とは、特定のファイル・データへのアクセスや更新を制御することです。特にファイルやデータベースへ書き込みを行う際、データの整合性を保つため別のプログラムによる書き込みを一時的に制御することを指します。

Java

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

Spring Boot

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

Q&A

解決済

1回答

1475閲覧

Javaにおけるメソッドの排他制御について

131505_01180109

総合スコア7

排他制御

排他制御とは、特定のファイル・データへのアクセスや更新を制御することです。特にファイルやデータベースへ書き込みを行う際、データの整合性を保つため別のプログラムによる書き込みを一時的に制御することを指します。

Java

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

Spring Boot

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

0グッド

0クリップ

投稿2019/08/29 09:36

編集2019/08/29 09:39

#前提
とあるSpring Bootアプリケーションを作成しています。
@Asyncアノテーションを付与することで、一部のサービスを非同期実行可能にしています。
しかし、その非同期実行の先で、一つのメソッド(以下、Aメソッド)に関しては排他制御をかけなければならないことが分かりました。

Aメソッドにはint型の引数があります。
1~8のいずれかが渡される予定です。

#分からないこと
引数で渡された数値を確認し、
現在Aメソッドが処理中の数値と同じものであれば、排他制御をかけたいと思っています。

つまり

  1. 引数1でAメソッド実行開始
  2. 引数2でAメソッド実行開始
  3. 引数でAメソッド実行開始
  4. 引数2のAメソッド実行終了
  5. 引数2でAメソッド実行開始
  6. 引数でAメソッド実行開始

上記の「状態6」の時点で排他制御をかけ、Aメソッド実行を待機させたいと考えています。
(もちろん、1、2、7以外の数値が引数で来た場合は、処理を開始します)
このような複雑な排他制御をかけるには、どうすれば良いでしょうか。

int型を引数に持つ他のメソッドをもう一つ作成し、Aメソッドを実行するかどうかを
そこで決める、なども考えたのですが・・・イマイチ実現する方法が分かりませんでした。
(Synchronizedを使えば実現できるのでしょうか・・・)

どなたかご教授願います。

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

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

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

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

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

xebme

2019/08/29 11:17

synchronizer token とか token と呼ばれるパターンを調べてください。
guest

回答1

0

ベストアンサー

かなり適当ですが...

java

1import java.util.ArrayList; 2import java.util.List; 3 4public class Sync { 5 public static void main(String args[]) throws InterruptedException { 6 new Thread(new Runnable(){public void run(){new Sync().A(1, 5000);}}).start(); 7 new Thread(new Runnable(){public void run(){new Sync().A(2, 1000);}}).start(); 8 new Thread(new Runnable(){public void run(){new Sync().A(7, 3000);}}).start(); 9 new Thread(new Runnable(){public void run(){try{Thread.sleep(2000);}catch(InterruptedException e){}; new Sync().A(2, 1000);}}).start(); 10 Thread t = new Thread(new Runnable(){public void run(){new Sync().A(7, 3000);}}); 11 t.start(); 12 t.join(); 13 } 14 15 private static List<Integer> lockList = new ArrayList<>(); 16 void A(int num, long millis) { 17 try { 18 synchronized (lockList) { 19 while(lockList.contains(Integer.valueOf(num))) lockList.wait(); 20 lockList.add(Integer.valueOf(num)); 21 } 22 23 try { 24 System.out.println("引数"+num+"でAメソッド実行開始"); 25 26 //処理 27 Thread.sleep(millis); 28 29 System.out.println("引数"+num+"でAメソッド実行終了"); 30 31 } finally { 32 synchronized (lockList) { 33 lockList.remove(Integer.valueOf(num)); 34 lockList.notifyAll(); 35 } 36 } 37 38 } catch (InterruptedException e) { 39 e.printStackTrace(); 40 } 41 } 42}

投稿2019/08/29 18:57

jimbe

総合スコア12648

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

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

131505_01180109

2019/08/30 00:12

コードまで書いてくださりありがとうございます! 調査してみます!
131505_01180109

2019/08/30 04:17 編集

jimbeさんの回答を参考に、課題を解決できそうです。 回答くださった方々ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問