The extern keywords is necessary when your project consist of multiple files and a variable defined in one of the source file is needed in another one. 
For example, if you define the variable in source1.c, then you must declare it as extern in source2.c (directly or by including an header file).
Any other file that reference the variable must declare it as extern.
See this post1 for a very very detailed explanation of the use of the extern keyword
EDIT
I was curious and thus continued to search on this topic.
This is the another relevant post2 which is directly addressing your question. And again the answer comes from Jonathan Leaffler.
Here, for sake of completeness, I will report an excerpt of the above question/answer.
The problem raised in the post was specifically: why if you define a variable in two distinct source files the compiler doesn't even rise a warning? 
Short answer is that you do not violate any constrain in the Standard and the compiler is free to decide what to do.
Moreover, as shown in post1, it is possible to write a code that actually works, using gcc and clang (and maybe other compilers too).
But why we should bother? We know that is better to use extern! I found very interesting the observation of the OP in post2:
Note: this is important because the question occurs in the context of
  static analysis. If the two files may refuse to be linked on some
  platform, the analyzer should complain, but if every compilation
  platform accepts it then there is no reason to warn about it.
The relevant paragraph of the C standard is:
J.5.11 Multiple external definitions
There may be more than one external definition for the identifier of
  an object, with or without the explicit use of the keyword extern; if
  the definitions disagree, or more than one is initialized, the
  behavior is undefined (6.9.2).
This means that the result is Undefined Behaviour (see also the comment to the post). And, as Jonathan Leffler said:
One of the things that can happen is that the program behaves as you
  expect; and J.5.11 says, approximately, "you might be lucky more often
  than you deserve"
Confirmed in the comment by Johannes Schaub:
To be really clear whether it's allowed or not: No it's undefined
  behavior in C. It's like doing a[10] = 0; even if a is a int a1;
Conclusion
Defining a variable in multiple files is Undefined Behaviour, don't do that unless you are doing some wired test. Use extern!