32. Modo balking: hablar sobre el modo de diseño único concurrente seguro para subprocesos-modo de diseño concurrente-a completar

1. escena

La función de guardado automático proporcionada por el editor debe abandonarse rápidamente: la operación de guardado se realiza automáticamente después de un cierto tiempo. Si el archivo no se ha modificado, la operación de guardado debe abandonarse rápidamente.

class AutoSaveEditor {
	// 文件是否被修改过,这个变量没有同步,通过对其加锁来保证类的线程安全
	boolean changed = false;
	// 定时任务线程池
	ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();

	// 定时执行自动保存
	void startAutoSave() {
		ses.scheduleWithFixedDelay(() -> {
			autoSave();
		}, 5, 5, TimeUnit.SECONDS);
	}

	// 文件自动存盘操作,读写changed加锁,减少加锁范围
	void autoSave() {
		synchronized(this){
			if (!changed) {
				return;
			}
			changed = false;
		}
		// 执行存盘操作
		// 省略且实现
		this.execSave();
	}

	// 编辑操作
	void	edit(){
		//省略编辑逻辑
		......
		// 读写changed加锁,减少加锁范围
		synchronized(this){
			changed	= true;
		}
	}
}

La variable compartida es una variable de estado, que es esencialmente una versión multiproceso de if. Algunas personas lo resumen como el modo Balking.

2. La implementación clásica del modo Balking

class AutoSaveEditor {
	// 文件是否被修改过,这个变量没有同步,通过对其加锁来保证类的线程安全
	boolean changed = false;
	// 定时任务线程池
	ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();

	// 定时执行自动保存
	void startAutoSave() {
		ses.scheduleWithFixedDelay(() -> {
			autoSave();
		}, 5, 5, TimeUnit.SECONDS);
	}

	// 文件自动存盘操作,读写changed加锁,减少加锁范围
	void autoSave() {
		synchronized(this){
			if (!changed) {
				return;
			}
			changed = false;
		}
		// 执行存盘操作
		// 省略且实现
		this.execSave();
	}

	// 编辑操作
	void	edit(){
		//省略编辑逻辑
		......
		// 读写changed加锁,减少加锁范围
		change();
	}

	private void change() {
		synchronized(this){
			changed	= true;
		}
	}
}

El modo Balking es esencialmente una solución a la "versión multiproceso de if" de una manera estandarizada. Para el ejemplo anterior de guardado automático, el método de escritura después de usar el modo Balking para normalizar se muestra a continuación. Encontrará que solo el método edit () La operación de asignación de la variable compartida modificada se extrae en change (), que tiene la ventaja de separar la lógica de procesamiento concurrente de la lógica de negocios .

3. Modo de balking con volátil

97 artículos originales publicados · elogiados 3 · 10,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_39530821/article/details/102848355
Recomendado
Clasificación