Java subproceso-tres métodos de sincronización

A salvo de amenazas

1. La secuencia de ejecución de subprocesos múltiples no se puede reproducir, pero el resultado de la ejecución debe ser reproducible.

2. La incompletitud de la operación de datos compartidos del hilo definitivamente hará que los datos se destruyan, lo que conducirá al problema de la seguridad del hilo de resultados impredecibles.

La introducción de la sincronización

1. Hay dos sintaxis sincronizadas integradas en el lenguaje java: bloques de código sincronizados y métodos sincronizados (métodos estáticos y métodos no estáticos) pueden resolver problemas de seguridad de subprocesos.

2. Primero, los cambios sincronizados en paralelo a serie, lo que por supuesto afectará la eficiencia de ejecución del programa, y ​​la velocidad de ejecución se verá afectada. En segundo lugar, el bloqueo del subproceso de funcionamiento sincronizado significa que el sistema operativo controla el núcleo de la CPU para cambiar el contexto. Este cambio en sí también consume mucho tiempo. Por lo tanto, el uso de la palabra clave sincronizada reducirá la eficiencia del programa.

problema:

La seguridad de los subprocesos es una preocupación importante en la programación concurrente. Cabe señalar que hay dos causas principales de los problemas de seguridad de los subprocesos. Una es la existencia de datos compartidos (también llamados recursos críticos) y la otra es que hay varios subprocesos en funcionamiento y compartir datos juntos.

solución:

Cuando hay varios subprocesos que operan con datos compartidos, es necesario asegurarse de que haya uno y solo un subproceso que opere datos compartidos al mismo tiempo, y otros subprocesos deben esperar hasta que el subproceso haya procesado los datos antes de continuar. Este método tiene un nombre llamado bloqueo de exclusión mutua, que puede Un bloqueo que logra el propósito de acceso de exclusión mutua, es decir, cuando un dato compartido es agregado al mutex por el subproceso que está accediendo actualmente, en el mismo momento, otros subprocesos solo pueden estar en un estado de espera hasta que el hilo actual termine de procesar el bloqueo y lo libere

  • Cada objeto en Java tiene un bloqueo de objeto, que en realidad es solo un valor de etiqueta en el encabezado del objeto
  • El objetivo de la sincronización es en realidad lograr el propósito de la ejecución de la cola de subprocesos.

1. Método de sincronización

Agregue restricciones de sincronización al método de modificación para recursos críticos, recursos críticos sincronizados
, objetos que son compartidos por múltiples subprocesos.

public class OperNum {
    
    
	private int target;  //操作的数据
	//操作数据的方法
	public synchronized void add() {
    
     //synchronized方法的同步锁为当前对象
		target++;
		System.out.println(Thread.currentThread().getName()+"add..."+target);
	}
	
	public synchronized void sub() {
    
    
		target--;
		System.out.println(Thread.currentThread().getName()+"sun..."+target);
	}
}

El principio del código anterior:
cuando un subproceso está ejecutando el método add, otros subprocesos no pueden ejecutar el método add o submétodo [Tampoco se puede ejecutar el método sincronizado, porque la palabra clave sincronizada introducirá un bloqueo mutex, y solo el subproceso que posee el bloqueo puede ejecutar el método sincronizado, otros subprocesos solo pueden bloquear y esperar], sincronizado es un bloqueo reentrante, es decir, el subproceso actual puede ejecutar otros métodos sincronizados, pero otros subprocesos no pueden ejecutar métodos sincronizados en el objeto actual y pueden ejecutar métodos sin restricciones sincronizadas


En segundo lugar, el bloque de código de sincronización

El candado aquí en realidad se designa manualmente y se recomienda.

synchronized(){
    
     执行的代码块}


public class MyThread extends Thread {
    
    
	private static int target = 0;  //操作目标   临界资源
	private boolean flag = true;  //不是临界资源    用来判断进行加操作 还是减 操作。
	
	private static Object lock = new Object();   //人为定义一个锁;
	public MyThread(boolean flag) {
    
    
		this.flag = flag;
	}
	
	public void run() {
    
    
	for(int i = 0;i<20;i++) {
    
    
		synchronized (lock) {
    
           //synchronized (lock) 可以保证{}中的代码执行具备原子性
			if(flag)
				target++;
			else
				target--;
			System.out.println(Thread.currentThread().getName()+(flag ? "add" : "sub")+"----"+target);
		}
	}
	}
	public static void main(String[] args) {
    
    
		for(int i = 0;i<4;i++) {
    
    
			new MyThread(i%2==0).start();
		}
	}
}

Tres, método estático sincrónico

Use el objeto de clase actual como un bloqueo, y todos los métodos estáticos son mutuamente excluyentes

  • Y los métodos no estáticos no son mutuamente excluyentes, porque el bloqueo del método sincronizado no estático es el objeto actual, no el bloqueo de clase.
public class OperNum {
    
    
	private static int target = 10;  //操作的数据
	 //针对操作数据的方法
	
	public synchronized  static void add() {
    
    
		target++;
		System.out.println(Thread.currentThread().getName()+"add---"+target);
	}
	
	public synchronized  static void sub() {
    
    
		target--;
		System.out.println(Thread.currentThread().getName()+"sub--"+target);
	}
}


Tengo tiempo para recuperar el resto

Supongo que te gusta

Origin blog.csdn.net/weixin_42437438/article/details/113871662
Recomendado
Clasificación