在多线程环境中遍历具有非空值的List时获取Null值

时间:2017-05-17 18:42:48

标签: java multithreading arraylist

在下面的代码段中,我使用for-each loop在列表上进行迭代,并在性能测试服务器上遇到null个值,其中包含数千个线程并登录用户。

List<Attribute> attributes = getRoleListAttributes();
Map<String, String> rolesAttribute = new HashMap<String, String>();

//Doing Null Check to be on safer side
if( attributes != null && !attributes.isEmpty() ) 
{
  for( Attribute attr : attributes )<------ Here getting attr as null
  {
    if( attr != null && attr.getApiAlias() != null && attr.getInternalName() != null  )
    {
      rolesAttribute.put( attr.getApiAlias(), attr.getInternalName() );
    }
    else
    { // In Server logs i am getting this error.
      LOGGER.error("Invalid Role Attribute (%s)",attr);
    }
  }
}

List<Attribute> attributes实际包含null但我也在getRoleListAttributes();

中进行空检查时,这种行为绝对可行。

getRoleListAttributes方法的实现:

public List<Attribute> getRoleListAttributes()
  {
    if( _apiEnabled == null )
    {
      if( _attributes != null && !_attributes.isEmpty() )
      {
        _validRoles = new ArrayList<Attribute>();
        for( String attrInternalName : _attributes.keySet() )
        {
          Attribute attr = _attributes.get( attrInternalName );
          if( attr != null )
          {
            if( attr.getApiAlias() != null && attr.getApiAlias().trim().length() > 0 )
            {
              _validRoles.add( attr );
            }
          }
        }
      }
    }
    return _apiEnabled;
  }

我无效检查无处可在 rolesAttribute List中输入null。

我唯一的疑问是在第一种方法中遍历List时有可能one thread在getRoleListAttributes()方法中,而_validRoles ArrayList开始从它的初始容量调整自身大小并且在第一个方法的同一时刻thread-1接收空值。

一般情况下,如果在列表尝试调整自身大小时在ArrayList上调用get(object)会发生什么。吗

0 个答案:

没有答案