- PR -

マルチスレッドプログラミングに関して

投稿者投稿内容
インスパ
大ベテラン
会議室デビュー日: 2002/08/30
投稿数: 125
投稿日時: 2005-03-22 17:32
マルチスレッドプログラミングに関して質問があります。
あるプログラムをjarファイル化してそのプログラムをWebから実行しています
jarファイル化したプログラムのmainをsynchronizedとすれば複数端末から同時に実行されても
一方は処理が終わるまで待つと思っていたのですが同時に実行されてしまいます。
同時に実行されても一方は待つようにするにはどのようにすればいいのでしょうか?
javaに関してはそれほど知識が無いのでご存知の方がいらっしゃればご教授願います。

以下に簡略したソースを記述します

●jarファイル化したプログラム(Hoge1.jar)
public final class Hoge1 extends Hoge2 {

public static synchronized int main() {

try {

  //ここで実際のロジックを実行
Hoge2.doGyoumu();

//エラーが無ければ0を戻す
return(0);

} catch (HogeException ex) {
  //エラーがあれば1を戻す
return(1);
}
}
}


●jarファイルを呼び出して実行するWebプログラム
import Hoge.Hoge1;
int ret = Hoge1.main();
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-03-22 17:41
Webから実行、というのはどのような手段をもって行っているのでしょうか?
cgi で実行しているのでしたらそれぞれ別のプロセスとして実行されてしまいます。マルチスレッド、ではなくマルチプロセスで動くことになりますので synchronized 修飾子をつけても同期されません。
サーブレットなどを使って同一の JVM(一つのjavaプロセス内)で同時に実行するのであれば synchronized されたメソッドは同期されます。ただし、この場合同期はインスタンス毎に行われますので毎回 Hoge1 クラスのインスタンスを生成していたのでは複数同時に実行されることになります。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-03-22 18:11
どういう条件で実行しているかにもよりますが、
実行方法を変えれないのであれば、
ロックを示すファイルを作成するとか、
物理的なブロックの為のオブジェクトを用意するのが無難かもしれません。

またstaticメソッドに対する同期化は、プロセスの違いの他に
クラスローダがそれぞれ別であっても同期化されません。
インスパ
大ベテラン
会議室デビュー日: 2002/08/30
投稿数: 125
投稿日時: 2005-03-23 10:09
インギさん、ご指示ありがとうございます
Webからの実行はサーブレットで実行しています。
開発環境としてはTomcat+Strutsを利用しており
Web画面のあるボタンが押されれば下記Actionが実行されるようになっております


import Hoge.Hoge1;
public final class TestAction {

public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws HogeException {

try {
int ret = Hoge1.mai
return (mapping.findForward("SUCCESS"));

} catch (HogeException ex) {
return (mapping.findForward("ERROR");
}
}
}


>サーブレットなどを使って同一の JVM(一つのjavaプロセス内)で同時に実行するのであれば
>synchronized されたメソッドは同期されます。
>ただし、この場合同期はインスタンス毎に行われますので毎回 Hoge1 クラスのインスタンス
>を生成していたのでは複数同時に実行されることになります。
すみませんがここの意味がよく判りません...
上記Action内でjarファイルのプログラムをimportして実行しているだけなのですが毎回Hoge1クラスのインスタンスを生成していることになるのでしょうか?
インスパ
大ベテラン
会議室デビュー日: 2002/08/30
投稿数: 125
投稿日時: 2005-03-23 10:10
かつのりさん、ご指示ありがとうございます

>どういう条件で実行しているかにもよりますが、
>実行方法を変えれないのであれば、
>ロックを示すファイルを作成するとか、
>物理的なブロックの為のオブジェクトを用意するのが無難かもしれません。
そうですね、そういう方法もありますね。

>またstaticメソッドに対する同期化は、プロセスの違いの他に
>クラスローダがそれぞれ別であっても同期化されません。
これはjarファイルのプログラムのmainメソッドがstaticなので
同期化ができないと言うことでしょうか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-03-23 10:39
jarはどこに配置していますかね?
Hoge1.main()とやる前に
System.out.println(Hoge1.class.getClassLoader());
ってやってみて下さい。(複数端末から同時に実行)
インスパ
大ベテラン
会議室デビュー日: 2002/08/30
投稿数: 125
投稿日時: 2005-03-23 11:09
かつのりさん、ご指摘のコードを実行してみました。
長いのですが、そのまま貼り付けます、2台の端末で実行しましたが内容は同じでした


WebappClassLoader
available:
Extension[javax.mail, implementationVendor=Sun Microsystems, Inc., implementationVendorId=com.sun, implementationVersion=1.3.1, specificationVendor=Sun Microsystems, Inc., specificationVersion=1.3]
Extension[org.apache.commons.beanutils, implementationVendor=Apache Software Foundation, implementationVersion=1.6, specificationVendor=Apache Software Foundation, specificationVersion=1.6]
Extension[org.apache.commons.collections, implementationVendor=Apache Software Foundation, implementationVersion=2.1, specificationVendor=Apache Software Foundation, specificationVersion=2.1]
Extension[org.apache.commons.digester, implementationVendor="Apache Software Foundation", implementationVersion="1.5", specificationVendor="Apache Software Foundation", specificationVersion="1.5"]
Extension[commons-fileupload, implementationVendor=Apache Software Foundation, implementationVendorId=, implementationVersion=1.0, specificationVendor=Apache Software Foundation, specificationVersion=]
Extension[commons-lang, implementationVendor=Apache Software Foundation, implementationVersion=1.0.1, specificationVendor=Apache Software Foundation, specificationVersion=1.0]
Extension[org.apache.commons.logging, implementationVendor=Apache Software Foundation, implementationVersion=1.0.3, specificationVendor=Apache Software Foundation, specificationVersion=1.0]
Extension[org.apache.commons.validator, implementationVendor=Apache Software Foundation, implementationVersion=1.0.2, specificationVendor=Apache Software Foundation, specificationVersion=1.0]
Extension[org.apache.struts.Struts Legacy Distribution, implementationVendor=Apache Software Foundation, implementationVersion=1.0, specificationVendor=Apache Software Foundation, specificationVersion=1.0]
Extension[Struts Framework, implementationVendor=Apache Software Foundation, implementationVendorId=org.apache, implementationVersion=1.1, specificationVendor=Apache Software Foundation, specificationVersion=1.1]
delegate: false
repositories:
/WEB-INF/classes/
required:
----------> Parent Classloader:
StandardClassLoader
available:
delegate: true
repositories:
file:C:\Program Files\Apache Group\Tomcat 4.1\shared\classes\
required:
----------> Parent Classloader:
StandardClassLoader
available:
Extension[commons-pool, implementationVendor=Apache Software Foundation, implementationVendorId=, implementationVersion=1.1, specificationVendor=Apache Software Foundation, specificationVersion=]
Extension[org.apache.commons.collections, implementationVendor=Apache Software Foundation, implementationVersion=2.1, specificationVendor=Apache Software Foundation, specificationVersion=2.1]
Extension[org.apache.commons.logging, implementationVendor=Apache Software Foundation, implementationVersion=1.0.3, specificationVendor=Apache Software Foundation, specificationVersion=1.0]
Extension[org.apache.tools.ant, implementationVendor=Apache Software Foundation, implementationVersion=1.6.0, specificationVendor=Apache Software Foundation, specificationVersion=1.6.0]
Extension[javax.mail, implementationVendor=Sun Microsystems, Inc., implementationVendorId=com.sun, implementationVersion=1.2, specificationVendor=Sun Microsystems, Inc., specificationVersion=1.2]
Extension[commons-dbcp, implementationVendor=Apache Software Foundation, implementationVendorId=, implementationVersion=1.1, specificationVendor=Apache Software Foundation, specificationVersion=]
Extension[org.apache.commons.dbcp, implementationVendor=Apache Software Foundation, implementationVersion=1.0, specificationVendor=Apache Software Foundation, specificationVersion=1.0]
Extension[org.apache.commons.pool, implementationVendor=Apache Software Foundation, implementationVersion=1.0.1, specificationVendor=Apache Software Foundation, specificationVersion=1.0]
delegate: true
repositories:
file:C:\Program Files\Apache Group\Tomcat 4.1\common\classes\
file:C:\Program Files\Apache Group\Tomcat 4.1\common\endorsed\xmlParserAPIs.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\endorsed\xercesImpl.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\activation.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\jasper-runtime.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\jasper-compiler.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\naming-resources.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\commons-pool-1.1.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\commons-collections.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\naming-common.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\commons-logging-api.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\ant.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\mail.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\servlet.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\jdbc2_0-stdext.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\jndi.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\naming-factory.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\jta.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\commons-dbcp-1.1.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\tools.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\axis.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\commons-dbcp.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\commons-pool.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\log4j-1.2.8.jar
file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\ojdbc14.jar1
required:
----------> Parent Classloader:
sun.misc.Launcher$AppClassLoader@67ac19
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-03-23 14:04
問題ないように見えますね。
「同時に実行されてしまう」のはどのようにして確認していますか?

スキルアップ/キャリアアップ(JOB@IT)