One classic type of problem is handling communications - especially asynchronous communications from multiple sources. That may be a bit much in an elementary course if you want to mostly avoid race conditions.
But a problem with a single producer and a single consumer can also be informative, though it doesn't completely avoid race conditions. Have some simple process produce some data (an object, say) and queue it. Have another process dequeue objects when available and handle them. The consumer can busy-wait on the queue in simple cases.
It is most informative when the producer is sometimes a bit faster than the consumer so that the queue normally has something to be processed. But other problems occur if it is consistently faster, of course.
You can also use such things as an introduction to the ideas around race conditions, dropped data, etc, since anomalies will eventually occur without some form of synchronization.
Such a simple setup that introduces a much deeper set of ideas is called a Toy Box in the Pedagogical Patterns community. The application isn't truly realistic, but gets students thinking about deeper issues that will be covered later in their education.