Должны ли синхронизироваться входные слушатели?

Мой пример кода, размещенный ниже, показывает два класса. Один реализует KeyListener, а другой реализует Runnable и работает в бесконечном цикле, спящем каждые 20 мс. Когда клавиша нажата, keyChar, который имеет форму int, используется в качестве индекса, устанавливающего индекс логического массива true или false, представляющий, нажата ли клавиша или нет. В то же время цикл процесса ищет в массиве ключей его истинные или ложные значения и устанавливает истинные значения в ложные, а затем распечатывает символ. Мой вопрос заключается в том, нужно ли мне использовать синхронизацию, используя блокировку для доступа к charArray, потому что он используется в двух потоках: нить процесса и нить ключевого слушателя.

Образец кода:

import java.awt.Component;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Input implements KeyListener {

public boolean[] charArray;

public Input(Component component) {
    charArray = new boolean[127];
    component.addKeyListener(this);
}

@Override
public void keyPressed(KeyEvent e) {
            (possible synchronization with a lock?)
    int keyChar = e.getKeyChar();
    if (keyChar == 27 || keyChar == 9 || keyChar == 10 || keyChar == 127) //useless keys like del, tab, esc, etc..
        keyChar = 65535;
    if (keyChar < 65535) //65535 represents no true char value
        charArray[keyChar] = true;
}

@Override
public void keyReleased(KeyEvent e) {
}

@Override
public void keyTyped(KeyEvent e) {
}
}




import java.awt.Dimension;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Process extends JFrame implements Runnable {

private boolean running;
private Input input;

public Process() {
    running = false;
    input = new Input(this);
    setTitle("Keyboard Test");
    setSize(new Dimension(200, 200));
    toFront();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}

/**
 * @param args
 */
public static void main(String[] args) {
    new Process().startThread();
}

public synchronized void startThread() {
    running = true;
    new Thread(this).start();
}

@Override
public void run() {
    while (running) {
                    (possible synchronization with a lock?)
        for (int i = 0; i < input.charArray.length; i++) {
            if (input.charArray[i] == true) {
                input.charArray[i] = false;
                System.out.println((char) i);
            }
        }
        try {
            Thread.sleep(20);
        } catch (InterruptedException e) {
        }
    }
}
}

Ответы на вопрос(2)

Ваш ответ на вопрос