I wonder what the synchronized key word do in below code, one is at send() method, another is at receive() method.
In which race condition scenario/scenarios the synchronized keyword want to prevent?
Thank you very much!
public class Data {
    private String packet;
    // True if receiver should wait
    // False if sender should wait
    private boolean transfer = true;
    public synchronized void send(String packet) {
        while (!transfer) {
            try { 
                wait();
            } catch (InterruptedException e)  {
                Thread.currentThread().interrupt(); 
                Log.error("Thread interrupted", e); 
            }
        }
        transfer = false;
        this.packet = packet;
        notifyAll();
    }
    public synchronized String receive() {
        while (transfer) {
            try {
                wait();
            } catch (InterruptedException e)  {
                Thread.currentThread().interrupt(); 
                Log.error("Thread interrupted", e); 
            }
        }
        transfer = true;
        notifyAll();
        return packet;
    }
}
 
     
    