はじめにJavaを使用した個人開発にて、Scalaで書かれたライブラリを呼び出す場面があったのですが、その際にマルチスレッドでの実装をする必要があり、考える機会になったので共有します。今回の記事では、以下を前提といたします。ライブラリ側のプロクラムを修正することはできない。今回触れるパターン今回は、以下3つのパターンについて扱います。パターン1とパターン2について結論としては、「別プロセスで実行することで使用するメモリ空間を分ける」ことで解決しました。以下のようなプログラムをマルチスレッドで呼びたいとします。以下の処理では意図した動作をしません。誤ったパターンで実装されているため処理が正常に完了しません。期待しない結果が返却されます。TimeUnit.MINUTES);}System.out.println("正常に処理が完了しました。");}}そこで、実行プロセスごと分けることで、問題を解消しました。読みやすいように2クラスに分けました。正しいパターンで実装されているため処理が正常に完了します。この処理は今回の記事の本質と関係ないので、処理を省略しています。具体的には、この処理はjarファイル内のファイルを検索する場合の処理が正しく実装されてません。{System.out.println(result);}}}実行プロセスごと分けることで、疑似的にスレッドセーフな実装になりました。ブロックを使用する」ことで解決しました。以下のようなプログラムをマルチスレッドで呼びたいとします。意図した動作をしません。使用した誤った実装を記載します。誤ったパターンで実装されているため処理が正常に完了しません。期待しない結果が返却されます。Exceptionが発生した場合は再実行する仕様とします。{System.out.println("実行の途中でファイルIOに失敗しました。TimeUnit.MINUTES);}System.out.println("正常に処理が完了しました。使用することでこの問題を解決しました。この方法は、性能が悪化しますので、利用に際しては性能要件をよく確認することをおすすめします。誤ったパターンで実装されているため処理が正常に完了しません。synchronizedブロックを追加したことで期待した結果が返却されます。Exceptionが発生した場合は再実行する仕様とします。{System.out.println("実行の途中でファイルIOに失敗しました。TimeUnit.MINUTES);}System.out.println("正常に処理が完了しました。");}}これで、意図した挙動になりました。性能要件を確認の上対処方法を検討してください。重要なことライブラリを使用する側は、ライブラリ側がどのような実装になっているかを完璧に把握することはとても難しいですし、時間もかかります。そこで、「テスト」を実施して処理に問題がないを確認することが重要になってきます。使用したテストコードを書くべきです。aを使用したテストコードを記述するべきです。自己紹介ソフトウェアエンジニアです。Javaを得意としていますが、フロントエンドやDevOps、モバイルアプリもやってます。開発標準や開発プロセスも守備範囲。