title: what's the best practice for accessing shared data with python multi-threading
body: <p>In python multi-threading, there are some atomic types that can be accessed 
  by multiple threads without protection(list, dict, etc). There are also some types need protected by lock. </p>
  
  <p><strong>My question is:</strong></p>
  
  <ol>
  <li><p>where can I find official document that list all atomic types, I can google some answers, but they are not "official" and out of date.</p></li>
  <li><p>some book suggest that we should protect all shared data with lock, because atomic type may because non-atomic, we shouldn't rely on it. Is this correct?
  because lock surely have overhead, is this overhead negligible even with big program?</p></li>
  </ol>