Unique character lookup
When in doubt, profile. We may theorize about possible optimizations, but only the profiler can definitely say where the program does spend time.
That said, 


the first/second spot logic looks suboptimal. Consider

if ((firstSpot &amp; mask) != 0) {
    secondSpot |= mask;
} else {
    firstSpot |= mask;
}



(using else may also be redundant).


It is unclear (to me) how for (char c : chars) over the char array fares against other techniques. This could be an entertaining reading.


Yet again, profile.
Strictly speaking, the challenge only says the string contain only lowercase letters, but does not specify the locale.