In this section, we’ll look at two examples that use synchronization to perform complex synchronization tasks.
Of all the different types of thread synchronization tools, the barrier is probably the easiest to understand and the least used. When we think of synchronization, our first thought is of a group of threads executing part of an overall task followed by a point at which they must synchronize their results. The barrier is simply a waiting point where all the threads can synch up either to merge results or to move on to the next part of the task. The synchronization techniques that we have discussed up to now were concerned with more complicated issues like preventing race conditions, handling data transfer and delivery, or signaling between threads.
Given its simplicity, why has the barrier not been mentioned up to
this point? We have actually used this technique; however, we have
used the Thread class itself to synch up the threads. By using the
method, we have waited for all of the
threads to terminate before we merged the results or started new
threads for the next task.
There are a few problems with using the
join() method. First, we must constantly create and terminate threads. This means that the threads may lose any state that they have stored in their previous operation. Second, if we must always create new threads, logical operations cannot be placed together: since new threads have to be created for each subtask, the ...