$30 off During Our Annual Pro Sale. View Details »

Thread-Safety in Go - An Overlooked Concern (Go Naviro eMeetup)

Preslav Mihaylov
July 01, 2021
68

Thread-Safety in Go - An Overlooked Concern (Go Naviro eMeetup)

A talk on learning the fundamentals of thread-safety in Go as presented at Go Naviro eMeetup (https://www.gonaviro.com/blog/2021/05/thread-safety-in-go-thursday-1st-july)

Materials - http://bit.ly/thread-safety-go

Preslav Mihaylov

July 01, 2021
Tweet

Transcript

  1. Thread-Safety in Go
    An Overlooked Concern
    P. Mihaylov
    Software Engineer, Tech. Trainer, Speaker
    [email protected]
    Go Naviro eMeetup, 2021

    View Slide

  2. 👋
    🚗 Software Engineer @ Uber
    🎤 Tech. Trainer & Speaker
    ✍ Blogging at pmihaylov.com
    󰞵 Open-sourcing at
    github.com/preslavmihaylov

    View Slide

  3. Why not a talk on concurrency?

    View Slide

  4. Most courses/books are incomplete…

    View Slide

  5. Not enough ❤ for thread-safety

    View Slide

  6. Concurrency without thread-safety ->
    200 mp/h 🏎 without safety measures

    View Slide

  7. Goals →
    1) Learn the fundamentals
    2) Get guidance on next steps

    View Slide

  8. What’s covered
    1. What does “thread-safety” mean?
    2. Should you care about it at all?
    3. Thread-safety problems & solutions
    a. When is there a potential thread-safety issue?
    b. Atomic access to shared state
    c. Delegating thread-safety
    d. Atomic compound actions
    e. Visibility & stale data
    4. Where to go from here?

    View Slide

  9. What does “thread-safety” mean?

    View Slide

  10. Safe classes →
    behave correctly

    View Slide

  11. Thread-safe classes →
    behave correctly
    while bombarded by
    a gazillion goroutines

    View Slide

  12. Should you care about it at all?

    View Slide

  13. “I don’t need
    thread-safe classes
    as I’m typically
    writing web apps
    without spawning
    any threads…”
    the average web dev

    View Slide

  14. You’re already writing
    multi-threaded applications...

    View Slide

  15. ...and no.
    Channels can’t save you every time

    View Slide

  16. View Slide

  17. Thread-safety problems & solutions

    View Slide

  18. When is there a potential
    thread-safety issue?

    View Slide

  19. View Slide

  20. Is it thread-safe?
    Join at slido.com
    #threadsafe

    View Slide

  21. Shared mutable state

    View Slide

  22. Non-shared state
    Stack #1
    Thread #1
    Non-shared
    state #1
    Non-shared
    state #2
    Shared memory
    aka heap
    Shared state
    Non-shared state
    Stack #2
    Thread #2

    View Slide

  23. Atomic access to shared state

    View Slide

  24. View Slide

  25. View Slide

  26. What can go wrong?

    View Slide

  27. View Slide

  28. Using Mutexes is Go’s standard way
    to add critical sections/locks

    View Slide

  29. Delegating thread-safety

    View Slide

  30. View Slide

  31. View Slide

  32. Delegated thread-safety →
    relying on the thread-safetiness of
    objects you use

    View Slide

  33. But also (third-party) packages...

    View Slide

  34. Atomic compound actions

    View Slide

  35. View Slide

  36. View Slide

  37. Actions from the
    same invariant need to be
    synchronized together

    View Slide

  38. Visibility & stale data

    View Slide

  39. View Slide

  40. View Slide

  41. Is it thread-safe?
    Join at slido.com
    #threadsafe

    View Slide

  42. Thread-safety is not only about
    concurrent writes...

    View Slide

  43. View Slide

  44. Remember 3+1 things

    View Slide

  45. 1

    View Slide

  46. Stateless methods →
    thread-safe methods

    View Slide

  47. View Slide

  48. 2

    View Slide

  49. Thread-safety is about
    both reads and writes...

    View Slide

  50. View Slide

  51. 3

    View Slide

  52. Prefer delegation over explicit
    synchronization

    View Slide

  53. View Slide

  54. 4

    View Slide

  55. Be careful with compound actions...

    View Slide

  56. View Slide

  57. View Slide

  58. Is that all I need to know?

    View Slide

  59. What’s not covered
    1. Initialisation safety & Immutable objects
    2. Thread-confinement
    3. Concurrency tooling - atomic variables/collections, synchronizers
    4. Goroutine Management
    5. Channels
    6. Managing goroutine lifecycle via cancellation/interrupts
    7. Dealing with performance/liveness issues (i.e. deadlock, livelock, etc.)
    8. The Go Memory Model

    View Slide

  60. View Slide

  61. Get the mats →
    https://bit.ly/thread-safety-go

    View Slide

  62. Thread-Safety in Go
    An Overlooked Concern
    P. Mihaylov
    Software Engineer, Tech. Trainer, Speaker
    [email protected]
    Go Naviro eMeetup, 2021

    View Slide