类的私有成员变量,若是多例则是线程私有,若单例则全局共享
程序员文章站
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;
}