Lendo um arquivo por vários threads

Eu tenho um arquivo de 250Mb para ser lido. E o aplicativo é multiencadeado. Se eu permitir que todos os threads leiam o arquivo, ocorre a falta de memória. Fico com erro de memória.

Para evitá-lo. Eu quero ter apenas uma cópia da String (que é lida a partir do fluxo) na memória e quero que todos os threads o usem.

while (true) {
    synchronized (buffer) {
        num = is.read(buffer);
            String str = new String(buffer, 0, num);

    }
    sendToPC(str);
}

Basicamente, eu quero ter apenas uma cópia da string quando todo o thread terminar de enviar, quero ler a segunda string e assim por diante.

questionAnswers(4)

yourAnswerToTheQuestion