Java ランタイム システムはマルチスレッド環境であるため、Java から呼び出す COBOL プログラムは、呼出し元の Java プログラムがマルチスレッド プログラムかどうかに関係なく、常にマルチスレッドの COBOL ランタイム システムとリンクする必要があります。COBOL プログラムをマルチスレッドの Java プログラムから呼び出す場合には、使用中の COBOL データに他のスレッドがアクセスしてデータが壊れてしまわないように対処する必要があります。
この問題には、次の方法で対処できます。
SERIAL を使用すると、複数のスレッドによる COBOL コードへのアクセスが、COBOL ランタイム システムによって直列化され、プログラムにアクセスできるスレッドが一度に 1 つのみに限定されます。これは最も安全性の高い選択肢ですが、潜在的なオーバーヘッドも最も大きくなります。この方法は、COBOL プログラムを介して共有リソース (共有プリンタなど) にアクセスする場合や、Java から呼び出した COBOL プログラムが、マルチスレッドに対応していない他の COBOL プログラムを呼 出す場合に適しています。
REENTRANT(2) (Windows) or "2" (UNIX) を使用すると、互いに独立したユーザー データ領域と FD ファイル領域が COBOL ランタイム システムによってスレッドごとに割り当てられます。これにより、プログラム内での競合の発生やデータ破損が防止されます。ただし、REENTRANT(2) (Windows) or "2" (UNIX) を指定したプログラムでは、他のスレッド化されていないプログラムを呼び出したり、他の共有リソースにアクセスする際のスレッド セーフが保証されません。したがって、そのような場合の安全性は SERIAL に劣ります。REENTRANT(2) (Windows) or "2" (UNIX) 指令では、スレッドが直前のスレッドの終了を待たずに実行されるため、パフォーマンス面では SERIAL より優れています。
スレッドローカル記憶域はスレッドごとに割り当てられるため、スレッドで使用しているデータに他のスレッドがアクセスし、データが破損する事態が回避されます。この方法は効率面でも優れていますが、既存のコードに常に使用できるとは限りません。
この方法は、スレッドローカルなデータと、スレッド間で共有するデータをユーザー側で指定できるため、効率面で非常に優れています。ただし、この方法を既存の COBOL コードで使用するには、Java ランタイム環境と既存のプログラムを仲介する COBOL ドライバ プログラムを作成する必要があります。このドライバ プログラムによって既存のプログラムへのアクセスを制御します。また、2 つのスレッドが同じコードに同時にアクセスしないように、ドライバ プログラムにはセマフォまたは同 の手法を使用する必要があります。
マルチスレッド環境ではプログラムが複数のスレッドによって共有されるため、COBOL プログラムのキャンセル処理は、十分に注意して実装する必要があります。キャンセル処理の手段として、CANCEL と com.microfocus.cobol.RuntimeSystem.cobcancel() メソッドのどちらを使用する場合も同様です。可能であれば、キャンセル処理はいっさい使用しないでください。
あるいは、CobolBean インターフェイスを使用して、COBOL プログラムの作業場所節を CobolBean クラスの特定インスタンスと関連付ける方法を検討します。