Java 多线程:在同步方法中使用 java.util.并发类是多余的



我有一个具有以下类级别变量的类:

private LinkedBlockingQueue<Integer> inputQueue;
private StringBuffer textBuffer;
private int currentIndex;
private String[] p;
private List<String[]> pageList;
private int cursor;

该类有一个方法setInput(),可以被多个线程访问。该方法像这样更改上述所有变量

public void setInput(String s) {
    p[cursor] = input;
    cursor++;
    if (cursor == 1000) {
        // UI logic
        textBuffer.setLength(0);
        p = new String[];
        cursor = 0;
    }
    // Some other logic here
    pageList.add(p);
    currentIndex++;
    if (!inputQueue.offer(currentIndex)) {
        throw new RuntimeException();
    }        
}

这些变量可以由类中的其他代码片段读取,但它们只能在 setInput() 中修改。并且类中的所有其他方法都没有线程安全问题。换句话说,它们被确保由主线程调用。在这种情况下,如果我把sync关键字放在方法setInput()之前,那么我是否需要使用java.util.concurrent的LinkedBlockingQueue?同步方法时,这些变量是否保证线程安全?谢谢。

为了线程安全,所有访问字段(读取和写入)的方法都应该synchronized

不,在您的方案中,使setInput方法synchronized是不够的。所有访问变量的方法都需要同步,仅读取变量的方法也需要同步,否则变量可能会在执行时读取setInput因此您可能会看到对象的不一致状态。

如果很多线程正在读取变量,但只有少数线程在写入它们,那么使读取方法也synchronized可能是不必要的性能瓶颈。在这种情况下,最好使用 ReadWriteLock ,以便所有读取线程可以同时访问该对象。

最新更新