función de llamada java de múltiples hilos no declarados como seguros para hilos

Hay una función JDK que, aunque los javadocs no lo declaran seguro para subprocesos, al mirar el código en Google, parece que podría obtener el resultado que quiero al llamarlo desde múltiples subprocesos sin efectos secundarios indeseables, ya que La función utiliza principalmente variables de pila. Por lo tanto, no importa si tiene bloques sincronizados. Sin embargo, me pregunto si me estoy perdiendo algo y eventualmente tengo problemas. La función es connection.call (requestMsg, url); de SOAPConnection de SAAJ api. ¿Algún indicador sobre cómo debería analizar esto para decidir usarlo desde múltiples hilos o no?

¡Gracias!

Respuesta 1

Infierno no . Si no está específicamente documentado como seguro para subprocesos, no asumiremos eso. No importa la recomendación de Sun escrita en los días de Vector, Hashtable, StringBuffer, el viejo modelo de memoria java y las máquinas de un solo procesador. La moda ha cambiado. Estamos viviendo en un mundo dramáticamente diferente de concurrencia de Java.

Para una clase mutable, es mucho más probable que esté escrita con un hilo en mente. Entonces diría que sin doc tendremos que asumir que es para un solo hilo. La sincronización externa debe usarse en una imagen más amplia de las cosas. (Eso generalmente ayuda al rendimiento en comparación con el bloqueo a un nivel más fino).

Para una clase que en realidad está diseñada para ser utilizada en múltiples hilos, debe proporcionar un documento minuciosamente detallado de cómo se comporta. No tiene sentido marcarlo simplemente como "hilo seguro". Hay muchas cosas que explicar y documentar, consulte cualquier clase de concurrencia.

Por lo tanto, no tiene sentido asumir un modo de seguridad de subprocesos "predeterminado". No significa nada

-

Para su consulta específica, si la implementación es así

constructor()
  open socket

Response call(Request)
  write request to socket output stream
  read response from socket input stream

close()
  close socket

Sin sincronización en call (), esto obviamente no es SEGURO. Si tiene lecturas / escrituras concurrentes en una conexión TCP, el caos está asegurado.

Supongamos que escribiera una implementación más segura, ¿guardaría silencio? Por supuesto no. Le diré al usuario que se permiten llamadas concurrentes; cada solicitud se escribe atómicamente; la tubería se usa para el rendimiento; las respuestas se devuelven en el orden de las solicitudes; close () puede ser invocado en cualquier momento por cualquier hilo; las llamadas pendientes tendrán x segundos para finalizar con gracia; después de eso se cancela la conexión; cualquier hilo en espera en la llamada () recibirá una excpetion.

Respuesta: 2

He visto el Fowler-Noll-Vo (FNV) recomendado como una buena opción para un algoritmo de hashing rápido para usar en nuestra implementación de un sistema de hashing consistente. Parece que no se puede encontrar una buena fuente de Java para ...

¿Alguien podría decirme cómo puedo anular el método HashSet's contiene () para usar una coincidencia de expresiones regulares en lugar de solo igual ()? O, si no se anula, ¿cómo puedo agregar un método para usar un patrón regex? Básicamente, yo ...

Estoy construyendo un sistema en Java / Groovy que involucra la invocación dinámica de servicios web. Utilizo JAX-WS para invocar un servicio con una interfaz WSDL 1.1, pero no pude encontrar ninguna información útil sobre ...

El reintento se especifica de la siguiente manera: <bean id = "retryAdvice" class = "org.springframework.integration.handler.advice.RequestHandlerRetryAdvice"> <property name = "retryTemplate"> ...