欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

类的私有成员变量,若是多例则是线程私有,若单例则全局共享

程序员文章站 2022-05-29 07:56:46
...

结论:类的私有成员变量,若是多例则是线程私有,若单例则全局共享 ,不要被私有给迷惑住了,私有成员变量是对类实例来说是私有,哈哈

问题背景:

        一个楼层资源是否展示是通过flag来控制的,一次请求中可以有n个楼层, 那么每个楼层开启一个线程去并行处理,理想情况下是每个线程用自己的flag部分true,部分false,结果问题是所有线程的flag值都一样,要么都true,要么都false

问题原因:

     @Service默认是单例,也就是全局唯一bean

解决方案:

    方案1. 把flag做成局部变量

    方案2. 把单例改为多例   在@Service下加另外一个注解@Scope("prototype")

@Service
public class FeedsActTask extends AbstractIndexTaskService<ActItemModel> {
    private static final org.apache.logging.log4j.Logger logger = LogManager.getLogger(FeedsActTask.class);


    private boolean flag;   //此变量会作为标示来,在下面的方法中被赋值


    @Override
    public IndexFloorModel doTask() {

        TaskContext.TaskRequest taskRequest = TaskContext.getTaskRequest();
        ChannelFloor<BaseFloorItem> channelFloor = (ChannelFloor<BaseFloorItem>) 
       List<BaseFloorItem> floorItems = channelFloor.getData();
      
        // 如果该楼层没有数据 直接返回
        if (CollectionUtils.isEmpty(floorItems)) {
            return null;
        }



        // 根据资源设置flag的值,然后再根据flag



       
        floor.setData(modelList);
        floor.setFloorStyle("act" + modelList.size());
        if (logger.isInfoEnabled()) {
            logger.info(channelFloor.getFloorId() + "Act任务执行后,返回楼层Floor: {}", JsonUtils.toJson(floor));
        }
        return floor;
    }

 

相关标签: 后端技术