lock - thread safe java example
Threadsafe vs Synchronized (7)
Soy nuevo en Java. Estoy un poco confundido entre Threadsafe y sincronizado. Thread safe significa que un método o instancia de clase puede ser utilizado por múltiples hilos al mismo tiempo sin que ocurra ningún problema. Donde como Sincronizado significa que solo un hilo puede operar en una sola vez.
Entonces, ¿cómo están relacionados el uno con el otro?
Sincronizado: solo un hilo puede operar al mismo tiempo. Threadsafe: un método o instancia de clase puede ser utilizado por múltiples hilos al mismo tiempo sin que ocurra ningún problema. Si relaciona esta pregunta como, ¿Por qué los métodos sincronizados son seguros para subprocesos? de lo que puedes obtener una mejor idea.
Según la definición, esto parece ser confuso. Pero no, si lo entiendes analíticamente.
Sincronizado significa: secuencialmente uno por uno en un orden, No al mismo tiempo [No al mismo tiempo]. El método sincronizado no permite actuar sobre otro hilo, mientras que un hilo ya está trabajando en él. Esto evita la concurrencia. ejemplo de sincronización: si desea comprar un boleto de cine y hacer cola. Recibirá el boleto solo después de que la persona que tiene enfrente obtenga el boleto.
Thread safe significa: el método se vuelve seguro para ser accedido por múltiples hilos sin ningún problema al mismo tiempo. La palabra clave sincronizada es una de las formas de lograr ''hilo seguro''. Pero recuerde: en realidad, mientras que varios hilos intentan acceder al método sincronizado, siguen el orden para que sea seguro el acceso. En realidad, incluso actúan al mismo tiempo, pero no pueden acceder al mismo recurso (método / bloque) al mismo tiempo, debido al comportamiento sincronizado del recurso.
Porque si un método se sincroniza, entonces esto se vuelve seguro para permitir que varios hilos actúen sobre él, sin ningún problema. Recuerda :: los hilos múltiples " no actúan sobre él al mismo tiempo ", por lo tanto, llamamos a los métodos sincronizados de seguridad de subprocesos.
Espero que esto ayude a entender.
La seguridad del subproceso es un comportamiento deseado del programa, donde el bloqueo synchronized
ayuda a lograr ese comportamiento. Existen otros métodos para obtener Seguridad de subprocesos, por ejemplo, clase / objetos inmutables. Espero que esto ayude.
Nayak, cuando declaramos que un método está sincronizado, todas las demás llamadas a él desde otros hilos están bloqueadas y pueden esperar indefinidamente. Java también proporciona otros medios de bloqueo con objetos de bloqueo ahora.
También puede declarar que un objeto es final o volátil para garantizar su disponibilidad a otros hilos concurrentes.
ref: http://www.javamex.com/tutorials/threads/thread_safety.shtml
La definición de seguridad de subprocesos dada en Java Concurrency in Practice es:
Una clase es segura para subprocesos si se comporta correctamente cuando se accede desde varios subprocesos, independientemente de la programación o el entrelazado de la ejecución de esos subprocesos por el entorno de tiempo de ejecución, y sin sincronización adicional u otra coordinación por parte del código de llamada.
Por ejemplo, un objeto java.text.SimpleDateFormat tiene un estado mutable interno que se modifica cuando se llama a un método que analiza o formatea. Si varios subprocesos llaman a los métodos del mismo objeto de formato de fecha, existe la posibilidad de que un subproceso pueda modificar el estado que necesitan los otros subprocesos, con el resultado de que los resultados obtenidos por algunos de los subprocesos pueden estar en error. La posibilidad de que el estado interno se corrompa provocando un resultado incorrecto hace que esta clase no sea segura.
Hay varias maneras de manejar este problema. Puede tener cada lugar de su aplicación que necesita un objeto SimpleDateFormat instanciar uno nuevo cada vez que necesita uno, puede hacer que un ThreadLocal contenga un objeto SimpleDateFormat para que cada subproceso de su programa pueda acceder a su propia copia (por lo que cada subproceso solo tiene para crear uno), puede usar una alternativa a SimpleDateFormat que no conserva el estado, o puede hacer el bloqueo usando synchronized
para que solo un hilo a la vez pueda acceder al objeto dateFormat. El bloqueo no es necesariamente el mejor enfoque, evitando el estado mutable compartido es mejor siempre que sea posible.
La palabra clave synchronized
es una forma de restringir el acceso a un método o bloque de código para que, de lo contrario, los datos inseguros no se corrompan. Esta palabra clave protege el método o bloque requiriendo que un hilo tenga acceso exclusivo a un determinado bloqueo (la instancia del objeto, si está sincronizada en un método de instancia, o la instancia de clase, si está sincronizada en un método estático, o la especificada bloquear si se usa un bloque sincronizado) antes de que pueda ingresar el método o bloque, al tiempo que proporciona visibilidad de la memoria para que los subprocesos no vean datos obsoletos.
Después de leer pacientemente muchas respuestas y no ser demasiado técnico al mismo tiempo, podía decir algo definitivo pero cercano a lo que Nayak ya había respondido a fastcodejava arriba, que aparece más adelante en mi respuesta, pero mira
la sincronización ni siquiera está cerca de la seguridad de las hebras de fuerza bruta; solo hace que una pieza de código ( o método ) sea segura e incorruptible para una sola cadena autorizada al impedir que otros hilos la utilicen.
La seguridad del subproceso se trata de cómo todos los subprocesos que acceden a un elemento determinado se comportan y obtienen los resultados deseados de la misma manera si hubieran sido secuenciales ( o incluso no ), sin ningún tipo de corrupción indeseada (perdón por el pleonasmo ) como en un ideal mundo.
Una de las formas de lograr la proximidad a la seguridad de hilos sería usar clases en java.util.concurrent.atomic .
¡Triste, sin embargo, ellos no tienen los métodos finales !
Seguridad de subprocesos : un programa seguro de subprocesos protege sus datos contra errores de coherencia de memoria. En un programa altamente multiproceso, un programa seguro para hilos no causa ningún efecto secundario con múltiples operaciones de lectura / escritura de múltiples hilos en datos compartidos (objetos). Los diferentes subprocesos pueden compartir y modificar datos de objeto sin errores de consistencia.
synchronized
es un método básico para lograr el código ThreadSafe.
Consulte las preguntas a continuación SE para obtener más detalles:
¿Qué significa ''sincronizado''?
Puede lograr seguridad de subprocesos mediante el uso de API de simultaneidad avanzada. Esta página de documentación proporciona buenas construcciones de programación para lograr la seguridad del hilo.
Los objetos de bloqueo admiten expresiones de bloqueo que simplifican muchas aplicaciones concurrentes.
Las Colecciones concurrentes facilitan la administración de grandes colecciones de datos y pueden reducir enormemente la necesidad de sincronización.
Las variables atómicas tienen características que minimizan la sincronización y ayudan a evitar errores de coherencia de memoria.
ThreadLocalRandom (en JDK 7) proporciona una generación eficiente de números pseudoaleatorios de múltiples hilos.
Consulte también los paquetes java.util.concurrent y java.util.concurrent.atomic para otras construcciones de programación.
Pregunta SE relacionada:
En la práctica, las clases de rendimiento seguro, Thread safe, Synchronized, no thread safe y no sincronizadas se ordenan como:
Hashtable(slower) < Collections.SynchronizedMap < HashMap(fastest)