COBOL ってすべてスレッドセーフじゃないのか?!

 OpenCOBOL で C ソースへの変換結果を見てみたら、WORKING-STORAGE が static 変数になってたんですよ。私の少ない他の COBOL 経験から考えても、たしかに WORKING-STORAGE は static 変数だったような……。

 と、いうことはです! こいつらを何も考えずに JavaEE 環境下に引きずり込んでマルチスレッドで使うのは自殺行為ということですね! 「WORKING-STORAGE を使わないで!」なんて言ったら、COBOLer に「寝言は寝て言え」と言われるのは目に見えてますし!

 ということで、ブリッジプログラム側などで同期化しなきゃいけないってことですね。

package bridge;

public class CobolBridge {
    static {
        // ライブラリのロード
        System.loadLibrary("j2cob");
    }

    /**
     * COBOL モジュールの初期化を行います。
     */
    public synchronized native void init();

    /**
     * COBOL モジュールを呼び出します。
     * 
     * @param moduleName
     *            COBOL モジュール名
     * @param parameter
     *            COBOL モジュールへのパラメータ
     * @throws CobolModuleException
     *            COBOL モジュールの呼び出しに失敗した場合
     */
    public synchronized native void callCobol(String moduleName,
           byte[] parameter) throws CobolModuleException;

 
    public static void main(String[] args) {
         CobolBridge cobolBridge = new CobolBridge();

         byte[] name = "Hoge      ".getBytes();

         cobolBridge.init();
         try {
             cobolBridge.callCobol("hello", name);
         } catch (CobolModuleException e) {
             e.printStackTrace();
         }
    }
}