Undergraduates are usually introduced to synchronization in operating systems through a discussion of classical problems such as reader-writer or producers-consumers. The traditional approach to teaching these topics is not effective in conveying to students how programs with incorrect synchronization actually behave. This paper introduces a simple probabilistic model for synchronization failure and shows how students can empirically study these issues. These activities are supported by a simulator that students can use to explore synchronization in the context of the bounded buffer problem. The simulator is written in Java and can be used either standalone or from a standard browser. Students can save the data and graphs generated by the simulator in a log file in HTML format.