La concurrencia causa confusión de objetos Java

I. Introducción

        Un requisito reciente es que los usuarios se suscriban a la información de la máquina de la tienda. El volumen de datos es relativamente grande y se coloca en el grupo de subprocesos para su ejecución durante el cálculo. La prueba previa muestra que la máquina de la tienda no corresponde.

dos, investigacion

        De hecho, no es una solución de problemas. Después de observar este fenómeno y luego mirar el código, sabrá que las propiedades del objeto están establecidas por diferentes hilos. El blogger se siente muy avergonzado. Este tipo de problema es muy bajo.

         Del código, podemos ver que debido a que hay demasiadas tiendas para el usuario, después de establecer la información de la tienda en chainDTO, se colocará en el grupo de subprocesos para el procesamiento comercial posterior, pero cuando los subprocesos posteriores usen este objeto, el principal thread todavía está configurando este objeto y continúa arrojándolo al grupo de subprocesos, por lo que las propiedades de los objetos utilizados por subprocesos secundarios cambian constantemente.

@Slf4j
@Component
public class ScheduleShopChainImpl extends CommonSubscribeShop implements SubscribeShopFacade<ChainDTO> {

    @Resource
    private MachineQueryService MachineQueryService;

    @Resource
    private SubscribeMachineFacadeFactory<ChainDTO> SubscribeMachineFacadeFactory;

    @Resource
    private ExecutorService subscribeShopExecutorService;
    @Resource
    private Mapper mapper;

    @Override
    public Boolean matching(SubscribeChainEnum factory) {
        return Objects.equals(SubscribeChainEnum.SCHEDULE, factory);
    }

    @Override
    public void process(ChainDTO chainDTO) {
        List<SubscribeShopDTO> SubscribeShopDTOList = super.getBySubscribeId(chainDTO.getSubscribeId());
        if (CollectionUtils.isEmpty(SubscribeShopDTOList)) {
            return;
        }

        SubscribeShopDTOList.stream().forEach(shop -> {
            chainDTO.setShopId(shop.getShopId());
            chainDTO.setShopName(shop.getShopName());
            chainDTO.setSubscribeShopId(shop.getId());
            subscribeShopExecutorService.execute(() ->
                    SubscribeMachineFacadeFactory
                            .getBean(chainDTO.getSubscribeChainEnum())
                            .process(chainDTO));
        });
    }


}

        El siguiente es un diagrama simple para describir la causa del problema. Se puede ver que diferentes subprocesos mantienen la aplicación del objeto en el montón, y el subproceso principal cambia constantemente la identificación de la tienda del objeto. Si el niño el hilo simplemente comienza a usarlo, es equivalente a repetir el cambio.Cálculo, pero una vez que se usa la tienda para obtener la información de la máquina para calcular el resultado, causará problemas para combinar la tienda y el resultado para empujar.

 

 También es muy simple modificar el problema.Después de copiar en profundidad el objeto, coloque el objeto copiado en el subproceso secundario.

3. Resumen

        El problema es muy simple, hay demasiados lugares donde los requisitos están dispersos, y este tipo de error se escribe sin prestar atención, e incluso se olvida el hábito de los objetos independientes de subprocesos múltiples.

Supongo que te gusta

Origin blog.csdn.net/m0_69270256/article/details/125439159
Recomendado
Clasificación