title: Why gevent needs synchronization since it is in a single threaded
body: <p>From the gevent docs:</p>
  
  <blockquote>
    <p>The greenlets all run in the same OS thread and are scheduled cooperatively.</p>
  </blockquote>
  
  <p>Then is it still necessary to use gevent lock primitives or gevent.Queue to avoid race conditions among multiple greenlets in a single thread? An example to demonstrate such a race condition would be very appreciated. From my own understanding, those synchronization primitives seems to be just a way to switch execution flow among greentlets.</p>