style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

MI APLICACION EN THREAD SAFE

quiero saber si mi aplicacion es thread safe e instancia en el lugar correcto el managedBean????
implemente mi datasource con spring
mis daos con spring
manejo un factory de la siguente manera

 public class DaoFactory {
   
    private static DaoFactory instance;

   //aqi syncronizo pero no se estoy haciendo mal....
    private synchronized static DaoFactory newInstance() {
        return new DaoFactory();
    }
    private BeanFactory factory;

    private DaoFactory() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("resources/applicationContext.xml");
        factory = (BeanFactory) ctx;
    }

    public static DaoFactory getInstance() {
        if (instance == null) {
            instance = newInstance();
        }
        return instance;
    }
    //DAO DE PRUEBA

    public UserDao getProductDao() {
        return (UserDao) factory.getBean("userDao");
    }

ahora tenfgo una clase que va hacer de managed bean

   public class ManagedBeanImpl implements ManagedBean
{
    // aqui declaro todos  mis dao de la aplicacion
    private UserDao userDao;

    public ManagedBeanImpl() {
//construyo todos los daos de mi aplicacion
        userDao =  DaoFactory.getInstance().getProductDao();
    }
   
    /*MODULO TEST*************************************************************************/
   
 
    @Override
    public Iterator<String> getUsers()
    {
        return userDao.getUsers();
    }
   
    @Override
    public List<IPersonaDTO> getPersona() {
       return userDao.getPersonas();
    }

    @Override
    public String getLogin(String inputTrama) {
        return userDao.getLogin(inputTrama);
    }
   
}

donde seria el lugar correcto de instanciar mi managed bean (el que instacia el daoFactory)
en mi socket java.
1.en el run antes del while que espera por tramas de los clientes???
2.o dentro del while?????

 public void run(){
            String inputLine,outputLine;
       
            serviceBusinnes = new ManagedBeanImpl();
            TramaService ts = new JASAK_TramaService(threadID, threadActive,puerto,serviceBusinnes);
           
            try {
                while ((inputLine= entrada.readLine()) != null)
                {
                    outputLine=ts.processInput(inputLine);
                    salida.println(outputLine);
                   }}}

aqui les dejo el xml de configuracion

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans <a href="http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
" title="http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
">http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
</a>   <bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"  destroy-method="close">
   
   <property name="driverClass" value="oracle.jdbc.OracleDriver" />
   <property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.x.x:1521:orcl" />
   <property name="username" value="sixxx"/>
   <property name="password" value="clavxxxx"/>
   <!--<property name="IdleConnectionTestPeriodInMinutes" value="60"/>-->
   <!--<property name="IdleMaxAgeInMinutes" value="240"/>-->
   <!--<property name="acquireIncrement" value="60"/>-->
   <property name="maxConnectionsPerPartition" value="20"/>
   <property name="minConnectionsPerPartition" value="5"/>
   
   
   <property name="partitionCount" value="1"/>
   <!--<property name="IdleConnectionTestPeriod" value="5"/>-->
 
   
   <!--<property name="acquireRetryAttempts" value="10"/>-->
 
   <!--<property name="connectionTimeoutInMs" value="1000"/>-->
   <!--<property name="IdleMaxAgeInMinutes" value="10"/>-->
   
  <!-- <property name="statementsCacheSize" value="100"/>-->
   
    </bean>  

 <!--
 <bean id="userService" class="com.app.UserServiceImpl">
     <property name="userDao" ref="userDao"/>
 </bean>
 -->
   
     <!--MODULO DE PRUEBAS DAO-->
      <bean id="userDao" class="com.app.dao.UserDaoImpl">
              <property name="dataSource" ref="dataSource" />
      </bean>
      <!--MODULO SERVICE BUSSINESS-->
      <!--
      <bean id="service" class="com.app.userservice.ManagedBeanImpl">
              <property name="userDao" ref="userDao"/>
             <property name="loteriaDao" ref="loteriaDao"/>
      </bean>
     
      -->
     

</beans>

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

no

para garantizar que tu singleton sea thread-safe mejor quita ese método estático synchronized y mete un bloque synchronized entre dos verificaciones de null en donde creas la instancia.

Double-Checked Locking

espero que esta sea la solucion que comento asi a todos los usuarios de este blog aprenden.

public class DaoFactory {
   
    private static DaoFactory instance;

 
    private BeanFactory factory;

    private DaoFactory() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("resources/applicationContext.xml");
        factory = (BeanFactory) ctx;
    }

    public static DaoFactory getInstance() {
        DaoFactory r = instance;
    if(r == null) {
        synchronized(DaoFactory.class) {  
            r = instance;      
            if(r == null) {  
                r = new DaoFactory();
                instance = r;
            }
        }
    }
    return r;
        /*OLD VERSION
        if (instance == null) {
            instance = newInstance();
        }
        return instance;
        * */

    }
    //DAO DE PRUEBA
    public UserDao getProductDao() {
        return (UserDao) factory.getBean("userDao");
    }
   
    //LOTERIA EN LINEA
   
}

Imagen de ezamudio

sobra la variable local r porque puedes usar directamente instance, pero sí, así es.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">