Acesso a outras classes

Olá, possuo as três classe abaixo, é claro que está faltando mais coisa, mas minha dúvida é se a forma como estou acessando as listas (tarefasList e trabalhadorList) está correta, ou se terei algum problema de desempenho ou qualquer outro, por favor, me expliquem que tipo de problema se houver.

public class Gerente {

	List<Tarefas> tarefasList;
	Map<String, Trabalhador> trabalhadorList;
	GerenteEstoque gerenteEstoque;
	GerenteVendas gerenteVendas;
	
	public Gerente() {
		this.tarefasList = Collections.synchronizedList(new LinkedList<Tarefas>());
		this.trabalhadorList = Collections.synchronizedMap(new LinkedHashMap<String, Trabalhador>());
		
		this.gerenteEstoque = new GerenteEstoque(this);
		this.gerenteEstoque.start();
		
		this.gerenteVendas = new GerenteVendas(this);
		this.gerenteVendas.start();
	}
}

public class GerenteEstoque extends Thread {

	Gerente gerente;
	List<Tarefas> tarefasList;
	Map<String, Trabalhador> workersList;
	Tarefas tarefa;
	
	public GerenteEstoque(Gerente gerente) {
		this.gerente = gerente;
		this.tarefasList = this.gerente.tarefasList;
		this.trabalhadorList = this.gerente.trabalhadorList;
	}
	
	public void run() {
		while (true) {
			this.tarefa = this.tarefasList.take();
				System.out.println("Gerente estoque: recebi uma tarefas, vou enviar para o trabalhador: " + this.trabalhadorList.get());
		}
	}
}

public class GerenteVendas extends Thread {
	Gerente gerente;
	List<Tarefas> tarefasList;
	Map<String, Trabalhador> workersList;
	Tarefas tarefa;
	Trabalhador trabalhador;
	
	public GerenteVendas(Gerente gerente) {
		this.gerente = gerente;
		this.tarefasList = this.gerente.tarefasList;
		this.trabalhadorList = this.gerente.trabalhadorList;
	}
	
	public void run() {
		while (true) {
			this.trabalhador = this.tarefasList.trabalhador();
				System.out.println("Gerente Vendas: recebi um novo trabalhador: "+ this.trabalhador.getID());
		}
	}
}

Achei um exemplo parecido na internet, por isso que estou implementando desta forma, mas não sei se esta correto. Outra forma que pensei em implementar é cada gerente instanciar sua própria lista, aí cada gerente adiciona em uma deteminada lista quando desejar.

Se alguém cosneguir me ajudar.

Você está quase lá. Mas geralmente, criamos métodos para enviar tarefas, ao invés de utilizar as listas diretamente.
Assim deixamos claro onde os pontos de sincronização entre as threads estão.

Além disso, ao invés de usar wrappers, se quiser usar as classes do java sincronizadas, prefira a a classe LinkedBlockingQueue do pacote java.util.synchronized.

Veja um exemplo simples e organizado do produtor consumidor:

Certo. Entendi a jogada. Acabei de implementar algo parecido com esse seu exemplo de Produtor/Consumidor, mas tenho uma dúvida, no trabalhador você tem uma linha

produtor.receberStatus(trabalhos.size()); estou precisando além disso uma atualização de status para o produtor de 5 em 5 segundos o que fiz foi criar uma outra thread, além disso preciso enviar o ID do trabalhador pois o meu produtor precisa ficar com essa informação armazenada ID+TamanhoDaLista

public class UpdateStatusTrabalhador extends Thread {
	
	TrabalhadorProdutor produtor;
	Trabalhador trabalhador;
	BlockingDeque<Integer> trabalhos = new LinkedBlockingDeque<Integer>();
	
	UpdateStatusTrabalhador(Trabalhador trabalhador, TrabalhadorProdutor produtor) {
		this.trabalhador = trabalhador;
		this.produtor = produtor;
	}

	public void run() {
		this.statusVerify();
	}

	public synchronized void statusVerify() {
		try {
			while (running) {
				this.produtor.statusSend(this.trabalhador.getID(), this.trabalhos.size());
				wait(5000);
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

O método this.trabalhador.getID() é sincronizado, estou correto na minha implementação?

Alguém pode me auxiliar a dúvida acima?