2016-04-19 13 views
0

私は春4.1でアプリケーションを開発しています。私は、春のControllers/Beanはスレッドセーフではないことを知っています。すなわち:シングルトン。つまり、コントローラの同じインスタンスが、複数の同時リクエストを処理するために使用されます。ここまで私は明らかです。コントローラクラスに@Scope("prototype")またはrequestを明示的に設定する必要があることを確認しますか?私はStackOverflowの以前の記事で、スコープがリクエスト/プロトタイプとして設定されていなくても、@RequestParamが渡されたか、メソッドの引数に関連付けられた@ModelAttributeに基づいてSpringコンテナが個々のリクエストを個別に処理できるようになりました。私のアプリのコントローラはスレッドセーフですか? Spring 4.1

だから私は確認したい私の次のコードは、同時に複数の要求を処理しても安全ですか?

@Controller 

public class LogonController { 

/** Logger for this class and subclasses */ 
protected final Log logger = LogFactory.getLog(getClass()); 

@Autowired 
SimpleProductManager productManager; 

@Autowired 
LoginValidator validator; 

@RequestMapping("logon") 
public String renderForm(@ModelAttribute("employee") Logon employeeVO) 
{ 
    return "logon"; 
} 
@RequestMapping(value="Welcome", method = RequestMethod.POST) 
public ModelAndView submitForm(@ModelAttribute("employee") Logon employeeVO, 
         BindingResult result) 
{ 
     //Check validation errors 
    validator.validate(employeeVO, result); 

    if (result.hasErrors()) { 
     return new ModelAndView("logon"); 
    } 

    if(!productManager.chkUserValidation(employeeVO.getUsername(), employeeVO.getPassword())){ 
     return new ModelAndView("logon"); 
      } 
    ModelAndView model = new ModelAndView("Welcome"); 
    return model ; 

} 
} 

また、別の疑問があります。 私は使用しているのでSimpleProductManager productManager;app-servlet.xmlのbean宣言にscope="prototypeを指定する必要がありますか?

以下

は私configuration.xmlのバリデータのシングルトン単一のインスタンスなので

<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource"><ref bean="dataSource"/></property> 
    <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
</bean> 

<bean id="productManager" class="com.BlueClouds.service.SimpleProductManager" > 
    <property name="productDao" ref="productDao"/> 
</bean> 

<bean id="productDao" class="com.BlueClouds.dao.HbmProductDao"> 
<property name="sessionFactory"><ref bean="mySessionFactory"/></property>   
</bean> 

<bean id="loginValidator" class="com.BlueClouds.service.LoginValidator" > 
</bean> 

が、そのために、すべての要求の間で共有されている私は、Beanの構成XMLでscope=requestを追加する必要がありますか、私はする必要がありますか同期ブロック内のサラウンドvalidate()?お知らせ下さい。

ありがとうございました。同じ時間に、:(ArrayListの例)

+0

なぜあなたは限り、あなたはそれらのクラスの状態を保存しないよう... singleton' 'など、他の何かを必要とするでしょう(そして、あなたがすべきではありません!)その後、何あなたは別のスコープを必要としません。あなたが他のクラスで何をするかに応じて、コントローラがスレッドセーフであれば可能です。 –

答えて

1

あなたはあなたのコードを伝えることができますが、以下の質問

  1. スレッドセーフされていない静的フィールドは、変更する可能性スレッドがあるに答えることで、スレッドセーフかではないでしょうか?

  2. はスレッドが同じ時間に、スレッドセーフではありません、インスタンスのフィールドが変更する可能性はありますか?

上記のいずれかの回答が「はい」の場合、コードはスレッドセーフではありません。

あなたのコードは、任意のフィールドを変更しないので、スレッドセーフでなければなりませんので。

スレッドセーフについての一般的な考えがあるかどうかのスレッドが/同じ時間に同じメモリ部へのアクセスを変えるかもしれないということです、それは必要とされている「同期」を意味し、スレッドセーフではありません。

方が良いJAVAでのスタックメモリ、ヒープメモリとグローバルメモリについての詳細を学ぶと思います。あなたのコードが同じ時間内に同じメモリセクションを変更するかどうかを理解することができます。

+0

私はそれを得ました! 。お二人のおかげです。 :-) – summary

関連する問題