Пример взят отсюда. Кто знает почему collectAssignment возвращает не более 2х анкет? В консоли 10 в submit и не более двух в collect.
package com.company;

import java.util.ArrayList;
import java.util.List;

// Sample class
public class ClassRoom {
    private int numOfSubmitted = 0;
    private int numOfCollected = 0;
    private Object object = null;
    // Volatile shared variable
    private volatile boolean newObject = false;

    public static void main(String[] args) throws InterruptedException {
        ClassRoom classRoom = new ClassRoom();
        Thread one = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                Object o = new Object();
                classRoom.submitObject(o);
            }
        });
        List<Object> list = new ArrayList<>();
        Thread two = new Thread(() -> {
            while (!one.isInterrupted()) {
                list.add(classRoom.collectObject());
            }
        });
        one.start();
        two.start();
        one.setPriority(1);
        two.setPriority(10);
        Thread.sleep(100);
        System.out.println(classRoom);
        System.out.println(list);
    }

    // Used by Thread 1
    public void submitObject(Object object) {

        // This keyword refers to current instance itself
        // 1
        this.object = object;
        // 2
        this.numOfSubmitted++;
        // 3
        this.newObject = true;
    }

    // Method 2
    // Used by Thread 2
    public Object collectObject() {
        while (!newObject) {// Wait until a new assignment is submitted
        }
        Object collectedObject = this.object;

        this.numOfCollected++;
        this.newObject = false;

        return collectedObject;
    }

    @Override
    public String toString() {
        return "ClassRoom{" +
                "numOfSubmitted=" + numOfSubmitted +
                ", numOfCollected=" + numOfCollected +
                ", object=" + object +
                ", newObject=" + newObject +
                '}';
    }
}