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

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

问题背景:

        一个楼层资源是否展示是通过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;
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值